==== 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