[[code_source_de_nrdos.mo5_version_3.5|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 / 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 [[code_source_de_nrdos.mo5_version_3.5|Retourner à la liste des fichiers]]