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
NBITM   FCB $04             ; 4 elements dans le menu

ELEM1   FCC /BASIC/         ; Titre 1 (32 octets max)
        ; Complete par des $00        
OFEL1   FCB $01             ; Disque source
FILE1   FCC /BASIC   MO5/   ; Fichier correspondant, 11 caractères                        

ELEM2   FCC /LOGO/          ; Titre 2 (32 octets max)
        ; Complete par des $00        
        FCB $01             ; Disque source
FILE2   FCC /LOGO    MO5/   ; Fichier correspondant, 11 caractères                        

ELEM3   FCC /LSE/           ; Titre 3 (32 octets max)
        ; Complete par des $00        
        FCB $01             ; Disque source
FILE3   FCC /LSE     MO5/   ; Fichier correspondant, 11 caractères                        

ELEM4   FCC /NRDOS/         ; Titre 4 (32 octets max)
        ; Complete par des $00        
        FCB $01             ; Disque source
FILE4   FCC /NRDOS   MO5/   ; Fichier correspondant, 11 caractères                        

; complete par des $00
; Maximum 20 elements, 1 element = 44 octets, soit 880 octets 

;       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               
     
        LDY    #FILE             
; Copie le nom de fichier en 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.1561710315.txt.gz · Last modified: 2019/06/28 10:25 by fool-duplex

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki