utils.asm
This is an old revision of the document!
Retourner à la liste des fichiers
* NRDOS.MO5 version 3.5
* UTILS.ASM (Routines utilitaires)
************************************************************************************************************
* UNKRT4
* Routine d'utilité inconnue (calcul de quelque chose)
************************************************************************************************************
UNKRT4 SET *
PSHS A,B
LDA #128
PSHS A
LDD UNKVR4
UK4LP1 ORCC #1
RORA
RORB
RORA
RORB
RORA
RORB
TSTA
BNE UK4LB1
LDA #$FF
UK4LB1 TSTB
BNE UK4LB2
LDB #$FF
UK4LB2 MUL
DEC ,S
BNE UK4LP1
ADDD UNKVR4
STD UNKVR4
TFR D,X
PULS A
PULS PC,B,A
UNKVR4 FDB $0101
************************************************************************************************************
* MUL16B
* Multiplication 16 bits avec résultat sur 32 bits
************************************************************************************************************
MUL16B SET *
PSHS X,Y
LEAX ,S
LEAY 2,S
LEAS -4,S
LEAU ,S
CLR ,U
CLR 1,U
LDA 1,X
LDB 1,Y
MUL
STD 2,U
LDA ,X
LDB 1,Y
MUL
ADDD 1,U
STD 1,U
BCC M16CR1
INC ,U
M16CR1 LDA 1,X
LDB ,Y
MUL
ADDD 1,U
STD 1,U
BCC M16CR2
INC ,U
M16CR2 LDA ,X
LDB ,Y
MUL
ADDD ,U
STD ,U
LDX ,U
LDD 2,U
LEAS 8,S
RTS
************************************************************************************************************
* PRSDSP
* Interprète une chaîne et affiche l'entier correspondant. Inutilisé.
************************************************************************************************************
PRSDSP SET *
JSR PRSINT
LBEQ PRMERR
LBCS PRMERR
TFR Y,D
JMP DSPDC2
************************************************************************************************************
* UNKRT5
* Routine d'utilité inconnue et inutilisée.
************************************************************************************************************
UNKRT5 SET *
JSR VALAZ
LBCS PRMERR
STX TMP16
JSR PRSINT
LBEQ PRMERR
LBCS PRMERR
LDX TMP16
STY ,X
RTS
************************************************************************************************************
* UNKRT6
* Routine d'utilité inconnue et inutilisée.
************************************************************************************************************
UNKRT6 SET *
JSR VALAZ
LBCS PRMERR
STX TMP16
JSR PRSINT
LBEQ PRMERR
LBCS PRMERR
JSR UNKRT4
JSR MUL16B
LEAX 1,X
LDY TMP16
STX ,Y
RTS
************************************************************************************************************
* VALAZ
* Transforme un caractère alphabétique isolé en une valeur entre 1 et 26
************************************************************************************************************
VALAZ SET *
JSR SKSPCL
JSR GETNCH
BEQ VAZERR
SUBB #'A
CMPB #26
BCC VAZERR
LDX #VALTAB
ABX
ABX
JSR GETNCH
BEQ VAZOK
CMPB #SPACE
BNE VAZERR
VAZOK ANDCC #$FE
RTS
VAZERR ORCC #1
RTS
************************************************************************************************************
* GETNCH
* Recupère le prochain caractère dans la ligne de commande
************************************************************************************************************
GETNCH SET *
PSHS A,X
LDX CLPTR
LDA CLTOGO
BEQ GNRTS
LDB ,X
LEAX 1,X
STX CLPTR
DECA
STA CLTOGO
ANDCC #$FB
GNRTS PULS PC,X,A
************************************************************************************************************
* UNKRT7
* Routine d'utilité inconnue et inutilisée.
************************************************************************************************************
UNKRT7 SET *
JSR CLS ; Efface l'écran
UK7LP1 JSR UNKRT4
LDY #320
JSR MUL16B
PSHS X ; Résultat = coordonnée X
JSR UNKRT4
LDY #200
JSR MUL16B
TFR X,Y ; Résultat = coordonnée Y
PULS X
JSR PSET ; Affiche le point
JSR KEYPRS
BEQ UK7LP1
JSR GETKEY
CMPB #SPACE ; Espace permet de sortir
BNE UK7LP1
JSR CLS ; Efface l'écran
RTS
************************************************************************************************************
* PSET
* Exécute la commande PSET. Inutilisé.
************************************************************************************************************
PSET SET *
CMPX #320
BCC PSERR
CMPY #200
BCC PSERR
GOTO PLOTH
PSERR PSHS X,Y
LDX #BADARG
JSR DSPSTR
PULS B,A
JSR DSPDC2
LDX #YEG
JSR DSPSTR
PULS B,A
JMP DSPDC2
BADARG FCB CR, LF
FCS "Mauvais argument pour PSET"
FCB CR, LF
FCS /X = /
YEG FCB CR, LF
FCC ", Y = "
FCB 0
VALTAB FDB 1, 2, 3, 4, 5, 6, 7, 8
FDB 9, 10, 11, 12, 13, 14, 15, 16
FDB 17, 18, 19, 20, 21, 22, 23, 24
FDB 25, 26
TMP16 FDB $0000
RMB 2
************************************************************************************************************
* HEXLIN
* Affiche un dump hexadécimal de A octets de la zone pointée par X.
************************************************************************************************************
HEXLIN SET *
TSTA ; A contient le nombre de caractère total
BEQ HEXRTS ; à afficher
PSHS A,X ; et X pointe sur la zone à dumper
LDB #8 ; 8 caractères par ligne
HEXLP1 PSHS B
JSR MEMFRM
LDB ,X+
JSR DHEX8 ; Affiche la valeur hexadécimale
LDB #SPACE
LBSR PCHAR
PULS B
DECA
BEQ HXCONT
DECB
BNE HEXLP1
BRA HEXSEP
HXCONT DECB
HEXTAB TSTB
BEQ HEXSEP
PSHS B
LDB #SPACE
LBSR PCHAR
LBSR PCHAR
LBSR PCHAR
PULS B
DECB
BRA HEXTAB
HEXSEP PULS X,A
LDB #SPACE ; Séparation
LBSR PCHAR
LBSR PCHAR
LDB #8 ; 8 caractères par ligne
HEXLP2 PSHS B
JSR MEMFRM
LDB ,X+
CMPB #SPACE
BCS HEXHI
CMPB #$7F
BHI HEXHI ; Si ce n'est pas de l'ASCII
BRA HEXCHR
HEXHI LDB #POINT ; Afficher un point à la place
HEXCHR LBSR PCHAR ; Affiche le caractère
PULS B
DECA
BEQ HEXCR
DECB
BNE HEXLP2
HEXCR LBSR DCRLF
BRA HEXLIN
HEXRTS RTS
************************************************************************************************************
* PRSPTH
* Interprète une chaîne comme un chemin et récupère le nom de fichier
************************************************************************************************************
PRSPTH SET *
PSHS A,Y ; On sauve la longueur de la commande et le pointeur sur le nom de fichier
CLRB ; Par défaut, disque = 0 (inconnu)
STB ,Y+
LDD #$200B ; et 11 espaces pour le nom de fichier
PPLP1 STA ,Y+
DECB
BNE PPLP1
PULS Y,A ; On récupère la longueur de la commande et le pointeur sur le nom de fichier
PSHS Y ; On sauve le pointeur
CMPA #2 ; Longueur de 2 ?
BCS PPLEN2
LDB #COLON ; 2ème car = ':' ?
CMPB 1,X
BNE PPLEN2
LDB ,X
CMPB #'A ; 1er caractère entre 'A' et 'J' ?
LBCS PPDONE
CMPB #'J
LBHI PPDONE
SUBB #AROB
STB ,Y ; On range le numéro de disque
LEAX 2,X ; On saute 2 caractères dans le buffer
DECA
DECA ; Longueur réduite de 2
LBEQ PPDONE ; Vide ? C'était juste un changement de disque.
PPLEN2 LEAY 1,Y
PSHS X
LDB #0
STB INPFLG
LDB #SLASH
CMPB ,X
BNE PPNSL1
LDB #$FF
STB INPFLG
LEAX 1,X
PPNSL1 CLR SBPTCT
PPLP2 LDB ,X+
CMPB #SLASH
BNE PPSTOP
INC SBPTCT ; Compte le nombre de '/' dans la chaîne
BRA PPLP2
PPSTOP LBSR SPTBCR
BNE PPLP2
PULS X ; Retour au début du token (-le disque si présent)
PSHS X,Y
LDY #DBUF01
PPLP3 LDB ,X+
LBSR SPTBCR
BEQ PPCPOK
STB ,Y+
BRA PPLP3
PPCPOK CLR ,Y+
PULS Y,X
PSHS Y
LDY #DBUF02
LDB #$FF
CMPB INPFLG
BNE PPNSL2
LDB #SLASH
STB ,Y+
LEAX 1,X
PPNSL2 LDB SBPTCT
CMPB #0
BEQ PPNSL3
PPLP4 LDB ,X+
CMPB #SLASH
BNE PPNSL4
DEC SBPTCT
BEQ PPNSL3
PPNSL4 STB ,Y+
BRA PPLP4
PPNSL3 CLR ,Y
PULS Y
LDB #8
PPLP5 PSHS B
TSTA
BEQ PPCLN1
LDB ,X+
DECA
CMPB #COLON
BEQ PPERR1
CMPB #SPACE
BLS PPERR1
CMPB #$7F
BHI PPERR1
CMPB #POINT
BEQ PPSUF1
CMPB #JOKER
BEQ PPJKR1
LBSR IDPOST ; '@' est un identifiant de poste
STB ,Y+
PULS B
DECB
BEQ PPFWD
BRA PPLP5
PPJKR1 LDB #QMARK
PPLP6 STB ,Y+ ; Remplit le nom avec des '?'
DEC ,S
BNE PPLP6
PULS B
BRA PPFWD
PPERR1 INCA
LEAX -1,X
PPCLN1 PULS B
BRA PPDONE
PPFWD TSTA
BEQ PPDONE
LDB ,X+
DECA
CMPB #POINT
BEQ PPSUF2
INCA
LEAX -1,X
BRA PPDONE
PPSUF1 PULS B
LEAY B,Y
PPSUF2 LDB #3 ; Trois caractères à identifier
PPSUFX PSHS B
TSTA
BEQ PPCLN2
LDB ,X+
DECA
CMPB #COLON
BEQ PPERR2
CMPB #POINT
BEQ PPERR2
CMPB #SPACE
BLS PPERR2
CMPB #$7F
BHI PPERR2
CMPB #JOKER
BEQ PPJKR2
LBSR IDPOST ; '@' est un identifiant de poste
STB ,Y+
PULS B
DECB
BEQ PPDONE
BRA PPSUFX
PPJKR2 LDB #QMARK
PPLP7 STB ,Y+ ; Remplit le suffixe avec des '?'
DEC ,S
BNE PPLP7
PULS B
BRA PPDONE
PPERR2 LEAX -1,X
INCA
PPCLN2 PULS B
PPDONE PULS Y ; On retourne au début du nom de fichier
LDB ,Y
BNE PPSKDK ; Disque non précisé ?
LDB CDISK,PCR ; Alors on prend le disque courant
STB ,Y
PPSKDK LDB #SPACE
TSTA
PPLP8 BEQ PPRTS
CMPB ,X
BEQ PPRTS
LEAX -1,X
DECA
BRA PPLP8
PPRTS RTS
INPFLG FCB $00 ; Flag : se trouve-t-on dans un chemin ou dans un nom de fichier ?
SBPTCT FCB $00 ; Nombre de sous-répertoires traversés
DBUF01 RMB 65 ; Buffers de chemin
DBUF02 RMB 65
utils.asm.1767354577.txt.gz · Last modified: by fool-duplex
