MAJI_EXE: A Multitasking Utility

See all articles from QL_DOC n12
Author(s): W. Lenerz
Publication: QL_DOC
Pub Details: QL_DOC n12 (Issue 12)
Date: October-November 1989
Pages: 9-13

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 <unité>_MAJI_EXE’ juste avant la ligne “EXEC_W <unité>_QUILL” (ou “EXEC_W <unité>_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 <unité>_MAJI_EXE, a
30 POKE_W a+30,xxx
40 DELETE <unité>_MAJI_EXE
50 SEXEC <unité>_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 <unité>_MAJIc_EXE, a
30 POKE_W a+30,xxx
40 DELETE <unité>_MAJIc_EXE
50 SEXEC <unité>_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

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.