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
FCS /, Y = /
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,0 ; Deux octets inutilisés
************************************************************************************************************
* 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 #ASTRSK
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 #ASTRSK
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,0 ; Buffers de chemin
DBUF02 RMB 65,0
************************************************************************************************************
* IDPOST
* Dans un nom de fichier, remplace @ par le numéro de poste de 1 à 9 ou de A à V.
************************************************************************************************************
IDPOST SET *
CMPB #AROB
BNE IPRTS
LDB NUPO
CMPB #10
BCC IPALFA
ADDB #'0
BRA IPRTS
IPALFA ADDB #$37
IPRTS RTS
************************************************************************************************************
* LUSTR
* Recherche une chaîne de caractères dans une table
************************************************************************************************************
LUSTR SET *
PSHS A
TSTA
LULOOP BEQ LUNOTF
CMPB ,X+
BEQ LUFND
DEC ,S
BRA LULOOP
LUNOTF LEAS 1,S
ANDCC #$FB
RTS
LUFND SUBA ,S+
ASLA
PSHS A,B
LEAX A,Y
LDD ,X
LEAX START,PCR
LEAX D,X
ORCC #4
PULS PC,B,A
************************************************************************************************************
* ENTREE
* Attends de presser ENTREE pour continuer. Inutilisé.
************************************************************************************************************
ENTREE SET *
PSHS A,B,X,Y
LEAX CNTSTR,PCR
LBSR DSPSTR
ENTKEY LBSR GETKEY
CMPB #CR
BNE ENTKEY
PULS PC,Y,X,B,A
CNTSTR FCB CR, LF
FCB US, $40+24, $40+1
FCC /<entr/
FCB ACC, 'B
FCS /ee> pour continuer. /
************************************************************************************************************
* SKPSPC
* Saute les caractères espace dans une chaîne
************************************************************************************************************
SKPSPC SET *
TSTA
BEQ SKRTS
LDB ,X
CMPB #SPACE
BNE SKRTS
DECA
LEAX 1,X
BRA SKPSPC
SKRTS RTS
************************************************************************************************************
* UPCASE
* Convertit un caractère minuscule en majuscule
************************************************************************************************************
UPCASE SET *
CMPB #'A
BCS UPRTS
CMPB #'Z
BHI UPRTS
SUBB #$20
UPRTS RTS
************************************************************************************************************
* STRUPR
* Convertit une chaîne de caractères minuscules en majuscules
************************************************************************************************************
STRUPR SET *
PSHS A,B,X
TSTA
SULOOP BEQ SURTS
LDB ,X
BSR UPCASE
STB ,X+
DECA
BRA SULOOP
SURTS PULS PC,X,B,A
************************************************************************************************************
* MEMCPY
* Copie une zone mémoire
************************************************************************************************************
MEMCPY SET *
TSTA
MCLOOP BNE MCNXT
RTS
MCNXT LDB ,Y+
STB ,X+
DECA
BRA MCLOOP
************************************************************************************************************
* PRSH16
* Convertit 4 caractères représentant un nombre hexadécimal en entier 16 bits. Inutilisé.
************************************************************************************************************
PRSH16 SET *
LDY #0
PSHS Y
LBSR SKPSPC
PSHS CC
LEAX 1,X
PULS CC
BEQ PHRTS
BRA PHLP1
PHNXTC BSR GETACH
BNE PHLP1
PHRTS PULS PC,Y
PHLP1 BSR ISHEX
BCC PHCONV
LEAX -1,X
INCA
BRA PHRTS
PHCONV LDY #4
PHLP2 ASL 1,S
ROL ,S
LEAY -1,Y
BNE PHLP2
ADDB 1,S
STB 1,S
BRA PHNXTC
************************************************************************************************************
* ISHEX
* Convertit un caractère représentant un chiffre hexadécimal en entier 4 bits
************************************************************************************************************
ISHEX SET *
LBSR UPCASE
SUBB #'0
BCS IHRTS
CMPB #10
BCS IHDONE
SUBB #7
CMPB #10
BCS IHERR
CMPB #16
BCC IHERR
IHDONE ANDCC #$FE
IHRTS RTS
IHERR ORCC #1
RTS
************************************************************************************************************
* GETACH
* Récupère le prochain caractère dans une chaîne
************************************************************************************************************
GETACH SET *
TSTA
BEQ GCRTS
LDB ,X+
DECA
ANDCC #$FB
GCRTS RTS
************************************************************************************************************
* PRSNMB
* Convertit une chaîne de caractère en entier
************************************************************************************************************
PRSNMB SET *
CLR ,-S
CLR ,-S
PSHS B
TSTA
BEQ PNERR
PNLOOP TSTA
BEQ PNRTS1
LDB ,X
LBSR UPCASE
CMPB #SPACE
BEQ PNRTS1
SUBB #'0
CMPB #10
BCS PNVLD
CMPB #17
BCS PNERR
SUBB #7
PNVLD CMPB ,S
BCC PNERR
LEAX 1,X
DECA
PSHS A
LDA 1,S
PSHS A
LDA #0
PNMUL ADDD 3,S
BCS PNRTS2
DEC ,S
BNE PNMUL
STD 3,S
PULS A
PULS A
BRA PNLOOP
PNRTS1 ANDCC #$FE
PULS PC,Y,B
PNERR ORCC #1
PULS PC,Y,B
PNRTS2 PULS B
PULS PC,Y,B,A
************************************************************************************************************
* PRSPFX
* Demande un nombre décimal ou hexadécimal. Inutilisé.
************************************************************************************************************
PRSPFX SET *
LEAX BUF06C,PCR
LBSR TINPUT
BNE PPCHK
LDY #0
RTS
PPCHK PSHS CC
LBSR DCRLF
LDB ,X
CMPB #DOLLAR
BNE PPDEC
LEAX 1,X
DECA
LDB #16
BRA PPDOIT
PPDEC LDB #10
PPDOIT LBSR PRSNMB
PULS PC,CC
************************************************************************************************************
* BN2HX
* Convertit un entier 16 bits en chaîne de caractères hexadécimale
************************************************************************************************************
BN2HX SET *
PSHS U
LEAU BASE16,PCR
BRA BN2GO
************************************************************************************************************
* BN2DC
* Convertit un entier 16 bits en chaîne de caractères décimale
************************************************************************************************************
BN2DC SET *
PSHS U
LEAU BASE10,PCR
BN2GO PSHS A,B
LDA ,U+
STA 1,S
PULS A
BN2LP1 BSR DIVISE
BNE BN2CNV
DEC ,S
BNE BN2LP1
LDB #'0
STB ,X+
BRA BN2RTS
BN2LP2 BSR DIVISE
BN2CNV PSHS B
LDB ,X
ADDB #'0
CMPB #'9
BLS BN2DGT
ADDB #7
BN2DGT STB ,X+
PULS B
DEC ,S
BNE BN2LP2
BN2RTS PULS PC,U,A
************************************************************************************************************
* DIVISE
* Effectue une division
************************************************************************************************************
DIVISE SET *
CLR ,X
DVLOOP SUBD ,U
BCS DVDONE
INC ,X
BRA DVLOOP
DVDONE ADDD ,U++
TST ,X
RTS
BASE10 FCB 5
FDB 10000
FDB 1000
FDB 100
FDB 10
FDB 1
BASE16 FCB 4
FDB $1000
FDB $100
FDB $10
FDB $1
************************************************************************************************************
* DINT
* Affiche un entier 8 bits en décimal
************************************************************************************************************
DINT SET *
CLRA
BSR CNVDEC
LEAX -2,X
LBRA DSPSTR
************************************************************************************************************
* DSPDC1
* Affiche un entier 16 bits en décimal
************************************************************************************************************
DSPDC1 SET *
BSR CNVDEC
LEAX -5,X
LBRA DSPSTR
************************************************************************************************************
* DSPDC2
* Affiche un entier en décimal
************************************************************************************************************
DSPDC2 BSR CNVDEC
LEAX CNVBUF,PCR
LBRA DSPSTR
************************************************************************************************************
* CNVDEC
* Convertit un entier 16 bits en décimal
************************************************************************************************************
CNVDEC SET *
LEAX CNVBUF,PCR
BSR BN2DC
CLR ,X
RTS
************************************************************************************************************
* DISPHX
* Affiche un entier 16 bits en hexadécimal. Inutilisé.
************************************************************************************************************
DISPHX SET *
LEAX CNVBUF,PCR
PSHS X
LBSR BN2HX
CLR ,X
PULS X
LBRA DSPSTR
FCC / /
CNVBUF RMB 6,0
utils.asm.1767619916.txt.gz · Last modified: by fool-duplex
