User Tools

Site Tools


menu_de_demarrage

This is an old revision of the document!


Les menus de démarrage MENU.MO5 et MENU.TO7 sont envoyés par le serveur lors de l'initialisation d'un poste et affichent le menu permettant de sélectionner une application.

Disquette de développement : menu.fd

* 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
menu_de_demarrage.1564509863.txt.gz · Last modified: 2019/07/30 20:04 by fool-duplex