User Tools

Site Tools


code_source_de_menu.mo5_v3.2

Code source de MENU.MO5 v3.1, 3.2, 3.3

* MENU.MO5 version 3.1

RESET  EQU    $FFFE
BEGRAM EQU    $2100
ENDRAM EQU    $A000
IRQRE  EQU    $A041
IRQPT  EQU    $2064
SYSPRA EQU    $A7C0
NUPOST EQU    $A7D8
EXT64  EQU    $A7CB
NUPO   EQU    $2052
RELACH EQU    $A02B
RESEAU EQU    $A025
M5VCT  EQU    $EFFE
ADCNTC EQU    $1FFE
ADCRDU EQU    $1FF4
ADTRCR EQU    $1FFA

TEMPO  EQU    $2039
DUREE  EQU    $203B
TIMBRE EQU    $203D
OCTAVE EQU    $203E

KTSTH  EQU    $0A
JPUTCH EQU    $82
JNOTEH EQU    $9E

SIZITM EQU    44
SIZFIL EQU    12

CR     EQU    $0D
LF     EQU    $0A
SPACE  EQU    $20
HYPHN  EQU    '-


       ORG    $5000

START  JMP    MAIN

* Table des entrees de menu
* Maximum 20 elements, 1 element = 44 octets, soit 880 octets au total

NBITM  FCB    4                               ; 4 elements dans le menu

ELEM1  FCC    /BASIC/                         ; Titre 1 (32 octets max)
       FCB    $00,$00,$00                     
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00

OFEL1  FCB    $01                             ; Disque source
FILE1  FCC    /BASIC   MO5/                   ; Fichier correspondant, 11 caracteres                        

ELEM2  FCC    /LOGO/                          ; Titre 2 (32 octets max)
       FCB    $00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00

       FCB    $01                             ; Disque source
FILE2  FCC    /LOGO    MO5/                   ; Fichier correspondant, 11 caracteres                        

ELEM3  FCC    /LSE/                           ; Titre 3 (32 octets max)
       FCB    $00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00

       FCB    $01                             ; Disque source
FILE3  FCC    /LSE     MO5/                   ; Fichier correspondant, 11 caracteres                        

ELEM4  FCC    /NRDOS/                         ; Titre 4 (32 octets max)
       FCB    $00,$00,$00                     
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00
       FCB    $00,$00,$00,$00,$00,$00,$00,$00

       FCB    $01                             ; Disque source
FILE4  FCC    /NRDOS   MO5/                   ; Fichier correspondant, 11 caracteres                        

       RMB    44*16

*       ORG    $5374
     
MAIN   EQU    *        
       ORCC   #$FF                            ; Pas d'interruptions            
       LDA    #$0C                            ; Preparation reboot a chaud                  
       STA    EXT64              
       LDX    #EXTOK             
       STX    M5VCT              
       CMPX   M5VCT              
       BNE    EXTOK                           ; Saut simple au menu         
       JMP    [RESET]                         ; Reboot et saut au menu

EXTOK  EQU    *            
       CLR    EXT64                           ; BASIC visible              
       LDX    #MSG1                           ; Affiche entete       
       JSR    PMSG            
       ORCC   #$FF                            ; Pas d'interruptions
                    
       LDX    #BEGRAM             
ZMEM1  EQU    *                               ; Efface la memoire de $2100 à $5002
       CLR    ,X+                
       CMPX   #NBITM             
       BCS    ZMEM1 
             
       LDX    #ENDPRG             
ZMEM2  EQU    *                               ; Efface la memoire de $563D à $9FFF
       CLR    ,X+                
       CMPX   #ENDRAM            
       BCS    ZMEM2   
           
       LDS    #BEGRAM+$100                    ; Fixe la pile en $2200             
       LDX    #IRQRE                          ; Fixe le vecteur IRQ du NR        
       STX    IRQPT
       LDA    NUPOST                          ; Lit no de poste              
       ANDA   #$1F                            ; de 0 à 31               
       STA    NUPO                            ; et le stocke              
       JSR    RELACH                          ; Libere la ligne              
       JSR    FORM                            ; Acces aux variables NR dans la video              
       LDX    #MAIN             
       STX    ADCNTC                          ; Reprise en main apres un CTRL-C         
       LDX    #CPTRD             
       STX    ADCRDU                          ; Zone de compte-rendu              
       LDX    #INCON             
       STX    ADTRCR                          ; Routine de traitement code inconnu              
       LDX    #MSG1B             
       JSR    PMSG             
       LDB    NUPOST                          ; Lit numero de poste              
       ANDB   #$1F                            ; de 0 à 31        
       CLRA                      
       JSR    DISPO                           ; Affiche numero de poste              
       LDX    #MSG2                           ; Affiche "MENU"        
       JSR    PMSG              

       LDB    #&24                            ; Calcule le nb de lignes               
       SUBB   NBITM                           ; vides à sauter        
       LSRB                                   ; (24-Nb. items)/2      
       BEQ    SKIP1             

VIDES  EQU    *                               ; Saute les lignes vides
       JSR    CRLF                            ; (Retour a la ligne)              
       DECB                      
       BNE    VIDES 

SKIP1  EQU    *             
       CLR    MAXLEN              
       LDX    #NBITM             
       LDB    ,X+                             ; X pointe sur 1er titre                
       PSHS   B                               ; Sauve le nb d'elements        

* Cherche la longueur max (plus grand titre)
CMAXLN EQU    *
       PSHS   X                               ; Sauve le ptr sur la table des elements        
       CLRA                      

STRLEN EQU    *                               ; Calcule longueur titre courant
       LDB    ,X+                
       BEQ    SKIP2              
       INCA                      
       BRA    STRLEN             
        
SKIP2  EQU    *                               ; 32 caracteres max
       CMPA   #&32               
       BLS    SKIP3              
       LDA    #&32               

SKIP3  EQU    *
       CMPA   MAXLEN              
       BLS    NEXT              
       STA    MAXLEN              

NEXT   EQU    *
       PULS   X                  
       LEAX   SIZITM,X                        ; Element suivant (+44)              
       DEC    ,S                 
       BNE    CMAXLN

* Calcule alignement a gauche =(39-MAXLEN-4)/2              
       PULS   B                  
       LDA    #&39               
       SUBA   MAXLEN              
       SUBA   #$04                            ; Longueur de "A - "           
       LSRA                      
       STA    ALINEA

* Affiche les choix, A est le premier              
       LDA    #'A               
       PSHS   A                  
       LDX    #NBITM             
       LDA    ,X+                             ; X pointe sur le premier titre                
       PSHS   A                               ; Sauve le nb d'elements
    
DISITM EQU    *                  
       JSR    ALIGN              
       LDB    1,S              
       JSR    PUTC                            ; Affiche touche a presser              
       LDB    #SPACE                          ; Affiche " - "               
       JSR    PUTC              
       LDB    #HYPHN               
       JSR    PUTC              
       LDB    #SPACE              
       JSR    PUTC
                     
       LDA    #&32                            ; 32 caracteres, $00 inclus
DISTIT EQU    *         
       LDB    ,X+                      
       JSR    PUTC              
       DECA                      
       BNE    DISTIT
              
       LEAX   SIZFIL,X                        ; Element suivant          
       JSR    CRLF                            ; Retour a la ligne              
       INC    1,S              
       DEC    ,S                 
       BNE    DISITM  
            
       LEAS   2,S              
       LDX    #MSG3                           ; Affiche "Votre choix : "             
       JSR    PMSG    

SELECT EQU    *          
       JSR    GETKEY                          ; Attends une touche              
       JSR    UPCASE                          ; Transforme en majuscule si necessaire              
       TFR    B,A                
       CMPB   #'A               
       BCS    BADKEY                          ; Sous ASCII A ? -> Mauvaise touche              
       SUBB   #'A               
       CMPB   NBITM              
       BCC    BADKEY                          ; Au-dessus dernier titre ? -> Mauvaise touche
                      
       PSHS   B                  
       TFR    A,B                
       JSR    PUTC                            ; Affiche la touche              
       PULS   B                  
       LDA    #SIZITM                         ; Multiplie par 44 (taille element)           
       MUL                       
       LDX    #OFEL1               
       LEAX   D,X                             ; X pointe sur le disque+nom de fichier correspondant          
       LDA    #SIZFIL                         ; 12 octets               

* Copie le nom de fichier en FILE     
       LDY    #FILE             
CPNAME EQU    *
       LDB    ,X+                
       STB    ,Y+                
       DECA                      
       BNE    CPNAME 
             
       LDX    #CONSIG                         ; Execute la consigne reseau (CHBIN)            
       JSR    RESEAU                

THEEND EQU    *
       BRA    THEEND                          ; Boucle infinie, attends chargement depuis le serveur
        
* Mauvaise touche pressee
BADKEY EQU    *           
       JSR    BEEP              
       JMP    SELECT  

* Attends une touche, uniquement si FLAGK=0  
GETKEY EQU    *            
       LDB    FLAGK,PCR          
       BEQ    SCRUT              
       CLR    FLAGK,PCR          
       RTS                       

SCRUT  EQU    *
       CALL   KTSTH               
       BEQ    SCRUT              
       RTS                       

FLAGK  FCB    $00      

* Caractere dans B (a-z) change en majuscule
UPCASE EQU    *
       CMPB   #'a               
       BCS    ENDUP              
       CMPB   #'z  
       BHI    ENDUP              
       SUBB   #$20
ENDUP  EQU    *               
       RTS                       

* Routine d'affichage caractere
PUTC   EQU    *
       CALL   JPUTCH                          ; Saut a PUTCH               

* Affiche ALINEA espaces
ALIGN  EQU    *
       PSHS   B,A                
       LDA    ALINEA              
       BEQ    ENDAL              

ALOOP  EQU    *
       LDB    #SPACE                          
       JSR    PUTC              
       DECA                      
       BNE    ALOOP
ENDAL  EQU    *              
       PULS   A,B,PC             

* Affiche un message termine par $00 pointe par X
PMSG   EQU    *
       LDB    ,X+                
       BNE    PCAR              
       RTS                       
PCAR   EQU    *
       JSR    PUTC              
       BRA    PMSG              

* Retour a la ligne
CRLF   EQU    *
       PSHS   B,CC               
       LDB    #CR               
       JSR    PUTC           
       LDB    #LF               
       JSR    PUTC              
       PULS   CC,B,PC            

* Passe la video en page forme
FORM   EQU    *
       PSHS   B                  
       LDB    SYSPRA              
       ORB    #$01               
       STB    SYSPRA              
       PULS   B,PC
        
* Routine de traitement code reseau inconnu          
INCON  EQU    *               
       RTS                       

* Joue un pouet
BEEP   EQU    *    
       PSHS   B,A,CC             
       LDD    #$0008             
       STD    OCTAVE              
       LDB    #$24               
       STB    DUREE+1              
       LDB    #$05               
       STB    TEMPO+1              
       LDB    #$03               
       STB    TIMBRE              
       LDB    #$31               
       JSR    PLAY              
       PULS   CC,A,B,PC          
PLAY   EQU    * 
       CALL   JNOTEH               

* Convertit un nombre 16 bits non signe en hexadecimal
* D = nombre, X = pointeur sur buffer caractere
CV16   EQU    *      
       PSHS   U                  
       LEAU   BASE16,PCR          
       BRA    CONVRT              

* Convertit un nombre 16 bits non signe en decimal
* D = nombre, X = pointeur sur buffer caractere
CV10   EQU    *
       PSHS   U                  
       LEAU   BASE10,PCR          

CONVRT EQU    *
       PSHS   B,A                
       LDA    ,U+                             ; Nombre de chiffres         
       STA    1,S              
       PULS   A         
       
LOOP2  EQU    *
       BSR    DIVIZ              
       BNE    BEGNB                           ; Dividende non nul -> debut du nombre         
       DEC    ,S                              ; Chiffre suivant         
       BNE    LOOP2              

       LDB    #'0                             ; D valait 0 en fait        
       STB    ,X+                
       BRA    CVEXIT              

CONTDV EQU    *
       BSR    DIVIZ                           ; Continue la division
              
BEGNB  EQU    *              
       PSHS   B                  
       LDB    ,X                              ; Chiffre courant               
       ADDB   #'0               
       CMPB   #'9               
       BLS    NOTHEX                          ; $A-$F ?           
       ADDB   #$07                            ; Correction
        
NOTHEX EQU    *            
       STB    ,X+                             ; Stocke le caractere           
       PULS   B                  
       DEC    ,S                              ; Chiffre suivant                 
       BNE    CONTDV              

CVEXIT EQU    *
       PULS   A,U,PC   
          
* Division de D par ,U
* D = reste, ,X = dividende (0..9 ou 0..F)
DIVIZ  EQU    *          
       CLR    ,X      

DVLOOP EQU    *           
       SUBD   ,U                 
       BCS    DVEXIT              
       INC    ,X                 
       BRA    DVLOOP

DVEXIT EQU    *              
       ADDD   ,U++               
       TST    ,X                 
       RTS                       

BASE10 EQU    * 
       FCB    5                               ; 5 chiffres
       FDB    &10000
       FDB    &1000
       FDB    &100
       FDB    &10
       FDB    &1
                
BASE16 EQU    *
       FCB    4                               ; 4 chiffres
       FDB    $1000
       FDB    $0100
       FDB    $0010
       FDB    $0001

* Affiche no. poste contenu dans B
DISPO  EQU     *
       CLRA                      
       BSR    CONV10              
       LEAX   -2,X                
       LBRA   PMSG 
    
* Affiche un nombre contenu dans D (inutilise)
DISP10 EQU    *             
       BSR    CONV10              
       LEAX   -5,X                     
       LBRA   PMSG
             
* Affiche un nombre contenu dans D (inutilise)
DSP10B EQU    *              
       BSR    CONV10              
       LEAX   STRBUF,PCR              
       LBRA   PMSG              

* Convertit un nombre 16 bits non signe en chaîne de caracteres (decimal)
* D = nombre, resultat dans STRBUF
CONV10 EQU    *
       LEAX   STRBUF,PCR          
       BSR    CV10              
       CLR    ,X                              ; Termine la chaine                 
       RTS                       

* Affiche un nombre en hexadecimal 16 bits (inutilise)
DISP16 EQU    *
       LEAX   STRBUF,PCR
       PSHS   X                  
       LBSR   CV16              
       CLR    ,X                 
       PULS   X                  
       LBRA   PMSG
              
       FCB    SPACE,SPACE,SPACE,SPACE              

STRBUF EQU    *           
       FCB    $00,$00,$00,$00,$00,$00         ; Buffer pour conversion numerique    
      
MAXLEN FCB    $00                             ; Longueur du plus grand titre
ALINEA FCB    $00                             ; Alignement a gauche      
            
MSG1   FCB    $1F,$20,$20
       FCB    $1F,$12,$14
       FCB    $1B,$44,$1B,$56,$1B,$66
       FCB    $0C
       FCB    $00
       
MSG1B  FCB    $11
       FCC    /NANORESEAU                     poste /
       FCB    $00
        
MSG2   FCC    /                /
       FCB    $1B,$73
       FCC    /MENU/
       FCB    $1B,$70
       FCB    $00        
        
MSG3   FCB    $1F,$58,$4D
       FCC    /Votre choix : /
       FCB    $00                
    
* Zone de consigne reseau    
CONSIG FCB    $18                             ; Longueur = 24
       FCB    $00                             ; DEST = serveur
       FCB    $09,$37                         ; Tache R = 09, Tache A = 55 (CHBIN)
       FDB    $0000                           ; Nb octets
       FCB    $00                             ; Page
       FDB    $0000                           ; Adresse
       FCB    $00                             ; Ordinateur
       FCB    $00                             ; Application
FILE   FCB    $00                             ; Disque 
       FCB    $00,$00,$00,$00,$00,$00,$00,$00 ; Nom du fichier
       FCB    $00,$00,$00                     ; Suffixe
       FCB    $00                             ; Mode de chargement
        
* Zone de compte-rendu reseau        
CPTRD  FCB    $08                             ; Longueur = 8
       FCB    $00,$00,$00,$00,$00,$00,$00,$00              
        
ENDPRG EQU    *

       END
code_source_de_menu.mo5_v3.2.txt · Last modified: 2023/05/27 13:54 by fool-duplex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki