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.

* 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    DISPL            
       ORCC   #$FF         ; Pas d'interruptions
                    
       LDX    #$BEGRAM             
ZMEM1  EQU *               ; Efface la memoire de $2100 à $5002
       CLR    ,X+                
       CMPX   #NBITM-1             
       BCS    ZMEM1 
             
       LDX    #ENDPRG             
ZMEM2  EQU *               ; Efface la memoire de $563D à $A000
       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    ADCTRLC      ; Reprise en main apres un CTRL-C         
       LDX    #CPTRD             
       STX    ADCRDU       ; Zone de compte-rendu              
       LDX    #INCON             
       STX    ADTRCTR      ; Routine de traitement code inconnu              
       LDX    #MSG1B             
       JSR    DISPL             
       LDB    NUPOST       ; Lit numero de poste              
       ANDB   #$1F         ; de 0 à 31        
       CLRA                      
       JSR    DISPO        ; Affiche numero de poste              
       LDX    #MSG2        ; Affiche "MENU"        
       JSR    DISPL              

       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    DISPL    ; Affiche touche a presser              
       LDB    #SPACE   ; Affiche " - "               
       JSR    DISPL              
       LDB    #HYPHN               
       JSR    DISPL              
       LDB    #SPACE              
       JSR    DISPL
                     
       LDA    #&32     ; 32 caracteres, $00 inclus
DISTIT EQU *         
       LDB    ,X+                      
       JSR    DISPL              
       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   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 à 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    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    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:                
        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     $05             ; 5 chiffres
        FDB     &10000,
        FDB     &1000,
        FDB     &100,
        FDB     &10,
        FDB     &1
                
BASE16  EQU *
        FCB     $04             ; 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)
DISP10B 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,$1F,$12,$14,$1B,$44,$1B,$56,$1B,$66,$0C,
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,$00,$00,$00 ; Nom du fichier
        FCB $00             ; Mode de chargement
        
; Zone de compte-rendu reseau        
CPTRD   FCB $08                                 ; Longueur
        FCB $00,$00,$00,$00,$00,$00,$00,$00              
        
ENDPRG  EQU *

        END                             
menu_de_demarrage.1561711056.txt.gz · Last modified: 2019/06/28 10:37 by fool-duplex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki