--- title: "MAJI_EXE: A Multitasking Utility" type: "article" slug: "maji_exe-a-multitasking-utility" url: "http://localhost/article/maji_exe-a-multitasking-utility/" markdown_url: "http://localhost/article/maji_exe-a-multitasking-utility.md" published_at: "2026-11-11T11:07:21+00:00" modified_at: "2026-11-11T11:07:21+00:00" featured_image: url: "http://localhost/wp-content/uploads/2022/04/20230809-041332.jpg" excerpt: "MAJI_EXE by W. Lenerz, from the QLCF, is a small job that multitasks with Quill and shows \"Maj.:\" in Quill's status area with two up arrows when caps lock is on, plus a permanent clock; MAJIc_EXE is a shorter version without the clock. The article explains how to start it from Quill's BOOT program and how to change its start-up delay with POKE_W, credits the Quanta library program Capsclock as the inspiration, and gives the commented 68000 assembler source, a universal SuperBASIC loader and the DATA lines for both MAJI_EXE and MAJIC_EXE." post_tag: - name: "French language" slug: "french-language" taxonomy: "post_tag" url: "http://localhost/tag/french-language/" - name: "Machine language programming" slug: "machine-language" taxonomy: "post_tag" url: "http://localhost/tag/machine-language/" - name: "Psion" slug: "psion" taxonomy: "post_tag" url: "http://localhost/tag/psion/" - name: "QL" slug: "ql" taxonomy: "post_tag" url: "http://localhost/tag/ql/" - name: "Superbasic (programming language)" slug: "superbasic-programming-language" taxonomy: "post_tag" url: "http://localhost/tag/superbasic-programming-language/" - name: "Type-in program" slug: "type-in-program" taxonomy: "post_tag" url: "http://localhost/tag/type-in-program/" model: - name: "Sinclair QL" slug: "sinclair-ql" taxonomy: "model" url: "http://localhost/model/sinclair-ql/" publication: "QL_DOC" publication_r: id: 52925 title: "QL_DOC" type: "periodical" url: "http://localhost/periodical/ql_doc/" authors: "W. Lenerz" issue: "12" issues_articles: - id: 76728 title: "QL_DOC n12" type: "issue" url: "http://localhost/issue/ql_doc-n12/" pages: "9-13" pubdate: "October-November 1989" archive_link: false volumeissue: "n12" --- # MAJI_EXE: A Multitasking Utility **In English:** MAJI_EXE by W. Lenerz, from the QLCF, is a small job that multitasks with Quill and shows "Maj.:" in Quill's status area with two up arrows when caps lock is on, plus a permanent clock; MAJIc_EXE is a shorter version without the clock. The article explains how to start it from Quill's BOOT program and how to change its start-up delay with POKE_W, credits the Quanta library program Capsclock as the inspiration, and gives the commented 68000 assembler source, a universal SuperBASIC loader and the DATA lines for both MAJI_EXE and MAJIC_EXE. *Printed title: MAJI_EXE. The article below is in French, as printed in QL_DOC n12 (October-November 1989).* *** MAJI_EXE est un petit logiciel supposé tourner en multitâche avec QUILL. MAJI_EXE va afficher dans la zone d’état de QUILL le mot “Maj.:”. Si vous êtes en mode majuscule, il affichera deux flèches vers le haut à côté de ces mots. MAJI_EXE va aussi afficher une horloge permanente dans la zone d’état, là où elle dérange le moins. Dans votre programme BOOT de QUILL, vous insérerez une ligne du style ‘EXEC _MAJI_EXE’ juste avant la ligne “EXEC_W _QUILL” (ou “EXEC_W _QLWP”). Le programme MAJI_EXE doit être sur l’unité, bien sûr. MAJIc_EXE (pour MAJI court) est une version racourcie de MAJI, qui n’affiche pas d’horloge et qui n’affiche que le mot “Maj.:” suivi ou non de flèches. Que ceux qui ont une unité de disquettes ne s’affollent pas: MAJI_EXE et MAJIc_EXE mettent un certain temps avant d’apparaître sur l’écran. Ceci a été fait exprès, pour que MAJI_EXE n’apparaisse pas avant que QUILL ne soit chargé. Avec des mdvs, QUILL met dans les 8 secondes à s’installer, MAJI_EXE se suspend donc au début pendant 8 secondes, afin de permettre à QUILL de s’installer. Ceux qui ont des disquettes peuvent varier le temps que met MAJI_EXE à apparaître, en tapant les commandes suivantes (faire ça sur une copie de MAJI_EXE, pas sur l’original): ``` 10 a = RESPR(234) 20 LBYTES _MAJI_EXE, a 30 POKE_W a+30,xxx 40 DELETE _MAJI_EXE 50 SEXEC _MAJI_EXE,a,234,50 ``` où xxx est un chiffre représentant xxx 60ièmes de secondes. Par conséquent, si vous voulez suspendre MAJI pendant 3 secondes, xxx doit être égal à 180. Pour MAJIc_EXE cela devient: ``` 10 a = RESPR(156) 20 LBYTES _MAJIc_EXE, a 30 POKE_W a+30,xxx 40 DELETE _MAJIc_EXE 50 SEXEC _MAJIc_EXE,a,156,20 ``` Ne POKE_W pas des valeurs supérieures à 65536, ou inférieures à 0… /* L’idée de ce programme m’a été inspiré par un programme nommé ‘Capsclock’ que j’ai trouvé sur la logithèque QUANTA. Je me suis fortement inspiré de ce programme, notamment pour le positionnement des fenêtres, mais j’ai écrit le code moi-même. */ MAJI_EXE par W. Lenerz (QLCF) ``` *************************** * MAJI_EXE * * par W. Lenerz * * source QLCF * *************************** BRA.S debut saut au début du job DC.L 'Wolf' entête standard DC.W $4AFB DC.W 4 DC.W 'Maji' nom du job debut MOVEQ #11,D0 MOVEQ #-01,D1 TRAP 1,D0=11 ($0B hex): changement de MOVEQ #01,D2 priorité du job. D2 contient la nou- TRAP #01 velle priorité:1 (la plus basse) MOVEQ #08,D0 MOVEQ #-01,D1 TRAP 1, D0=8 :on suspend le job pen- MOVE.W #400,D3 dant 400/60è de secondes pour permet- SUBA.L A1,A1 tre à Quill de se charger. Ceux avec TRAP #$01 des disquettes peuvent raccourcir ça MOVEA.W $00C8,A2 LEA fen1,A1 établissement de la 1ère fenetre JSR (A2) MOVEA.L A0,A5 A5=ID canal 1ère fen. MOVEA.W $00C8,A2 LEA fen2,A1 JSR (A2) établissement de la 2è fen. MOVEA.L A0,A4 A4=ID canal 2ème fen. SUBA.L A6,A6 boucle MOVEA.L A4,A0 MOVEQ #$11,D0 TRAP 3, D0=$11: positionnement du MOVEQ #$00,D1 curseur dans la 2è fen. MOVEQ #-$01,D3 D1= No. de colonne TRAP #$03 MOVEQ #$07,D0 MOVEQ #$06,D2 TRAP 3, D0=7: envoi d'une chaîne MOVEQ #-$01,D3 d'octets. D2 contient le nombre d'oc- LEA maj,A1 tets à envoyer, A0 l'ID du canal TRAP #$03 CMP.B $00028088,D0 si contenu de 28088h =D0 (=0) alors BEQ.S suppri on est en minuscules et on saute MOVEQ #$29,D0 à 'supprime'. Sinon on affiche '↑↑' MOVEQ #$07,D1 TRAP 3, D0=$29: MOVEQ #-$01,D3 On met l'encre en blanc (D1) TRAP #$03 MOVEQ #$07,D0 On envoit '↑↑', TRAP 3, D0=7 MOVEQ #$02,D2 A1 contient l'adresse du début de MOVEQ #-$01,D3 la chaîne LEA fleche,A1 TRAP #$03 MOVEQ #$29,D0 MOVEQ #$04,D1 On remet l'encre au vert MOVEQ #-$01,D3 TRAP #$03 BRA.S horlo et on saute à l'horloge suppri MOVEQ #$07,D0 on supprime la flèche en imprimant MOVEQ #$02,D2 deux espaces MOVEQ #-$01,D3 LEA espace,A1 TRAP #$03 horlo MOVEQ #$13,D0 début de l'horloge TRAP #$01 on cherche l'heure, ds D1 * maintenant, on convertit la date * dans D1 en ASCII MOVEA.W $00EC,A2 vecteur concerné LEA pile,A1 debut de la pile qui est à l'envers JSR (A2) et on convertit la date (ds D1) SUB.L D2,D2 LEA pile,A1 debut de la pile SUB.W #22,A1 MOVEA.L A5,A0 MOVEQ #$07,D0 puis on affiche la date MOVE.W (A1)+,D2 MOVEQ #-$01,D3 TRAP #$03 MOVEQ #$11,D0 et on positionne le curseur MOVEQ #$00,D1 D1 = col. curseur MOVEQ #-$01,D3 TRAP #$03 MOVEQ #$08,D0 on va suspendre le job MOVEQ #-$01,D1 pendant 5/60 sec MOVEQ #$05,D3 SUBA.L A1,A1 TRAP #$01 BRA.S boucle * Définition de la fenetre fen1 DC.B 0 couleur bord DC.B 0 largeur bord DC.B 0 couleur papier DC.B 7 couleur encre DC.W 120 largeur DC.W 10 hauteur DC.W 162 coord. x du coin gauche sup. DC.W 246 " y " " " " fen2 DC.B 0 définition fenetre 2 DC.B 0 comme ci-haut... DC.B 0 DC.B 4 DC.W 54 DC.W 10 DC.W 114 DC.W 236 maj DC.B 'Maj.: ' fleche DC.W '↑↑' espace DC.W ' ' DC.L 0 DC.L 0,0,0,0,0 pile DC.L 0 pseudo DC.L 0 END ``` > Chargeur universel SuperBASIC ``` 100 REMark CHARGEUR_BAS 110 REMark pour QL_DOC 120 : 130 INPUT "Où sauver les codes (ex. flp1_)?";sauve$ 140 IF LEN(sauve$)=0:sauve$="flp1_" 150 PRINT "Un instant s.v.p."; 160 : 170 RESTORE 1000 180 memoire=RESPR(1000):base_memoire=memoire 190 compte=0 200 : 210 REPeat boucle 220 IF EOF:EXIT boucle 230 READ octet:POKE memoire,octet:memoire=memoire+1 240 compte=compte+1 250 PRINT "."; 260 END REPeat boucle ``` > Insérez içi les lignes DATA < DATA pour la création de MAJI_EXE ``` 900 PRINT "Une touche pour sauver "&sauve$&"MAJI_EXE" 910 PRINT "("&compte&" octets)" 915 PAUSE 920 SEXEC sauve$&"maji_exe",base_memoire,compte,50 925 PRINT "Ok!" 930 : 1000 DATA 96, 12, 87, 111, 108, 102, 74, 251, 0, 4 1001 DATA 77, 97, 106, 105, 112, 11, 114, 255, 116, 1 1002 DATA 78, 65, 112, 8, 114, 255, 54, 60, 1, 144 1003 DATA 147, 201, 78, 65, 52, 120, 0, 200, 67, 250 1004 DATA 0, 146, 78, 146, 42, 72, 52, 120, 0, 200 1005 DATA 67, 250, 0, 146, 78, 146, 40, 72, 157, 206 1006 DATA 32, 76, 112, 17, 114, 0, 118, 255, 78, 67 1007 DATA 112, 7, 116, 6, 118, 255, 67, 250, 0, 132 1008 DATA 78, 67, 176, 57, 0, 2, 128, 136, 103, 30 1009 DATA 112, 41, 114, 7, 118, 255, 78, 67, 112, 7 1010 DATA 116, 2, 118, 255, 67, 250, 0, 110, 78, 67 1011 DATA 112, 41, 114, 4, 118, 255, 78, 67, 96, 12 1012 DATA 112, 7, 116, 2, 118, 255, 67, 250, 0, 90 1013 DATA 78, 67, 112, 19, 78, 65, 52, 120, 0, 236 1014 DATA 67, 250, 0, 102, 78, 146, 148, 130, 67, 250 1015 DATA 0, 94, 146, 252, 0, 22, 32, 77, 112, 7 1016 DATA 52, 25, 118, 255, 78, 67, 112, 17, 114, 0 1017 DATA 118, 255, 78, 67, 112, 8, 114, 255, 118, 5 1018 DATA 147, 201, 78, 65, 96, 130, 0, 0, 0, 7 1019 DATA 0, 120, 0, 10, 0, 162, 0, 246, 0, 0 1020 DATA 0, 4, 0, 54, 0, 10, 0, 114, 0, 236 1021 DATA 77, 97, 106, 46, 58, 32, 190, 190, 32, 32 1022 DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1023 DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1024 DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1025 DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ``` DATA pour la création de MAJIC_EXE ``` 900 PRINT "Une touche pour sauver "&sauve$&"MAJIC_EXE" 910 PRINT "("&compte&" octets)" 920 PAUSE 930 SEXEC sauve$&"MAJIC_EXE",base_memoire,compte,20 940 PRINT "Ok!" 950 : 1000 DATA 96, 14, 87, 111, 108, 102, 74, 251, 0, 5 1001 DATA 77, 97, 106, 105, 99, 0, 112, 11, 114, 255 1002 DATA 116, 1, 78, 65, 112, 8, 114, 255, 54, 60 1003 DATA 1, 194, 147, 201, 78, 65, 52, 120, 0, 200 1004 DATA 67, 250, 0, 82, 78, 146, 42, 72, 157, 206 1005 DATA 32, 77, 112, 17, 114, 0, 118, 255, 78, 67 1006 DATA 112, 7, 116, 6, 118, 255, 67, 250, 0, 68 1007 DATA 78, 67, 176, 57, 0, 2, 128, 136, 103, 30 1008 DATA 112, 41, 114, 7, 118, 255, 78, 67, 112, 7 1009 DATA 116, 2, 118, 255, 67, 250, 0, 46, 78, 67 1010 DATA 112, 41, 114, 4, 118, 255, 78, 67, 96, 196 1011 DATA 112, 7, 116, 2, 118, 255, 67, 250, 0, 26 1012 DATA 78, 67, 96, 182, 0, 0, 0, 4, 0, 54 1013 DATA 0, 10, 0, 114, 0, 236, 77, 97, 106, 46 1014 DATA 58, 32, 190, 190, 32, 32 ```