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.1564509849.txt.gz · Last modified: (external edit)
