Pl2 CORRIG 2.DOC/fr: Difference between revisions
Jump to navigation
Jump to search
m (Added category) |
Olivier.jan (talk | contribs) mNo edit summary |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | {{Languages|Pl2 CORRIG 2.DOC}} |
||
<pre> |
<pre> |
||
Line 16: | Line 17: | ||
68000. |
68000. |
||
− | Je passe sur les |
+ | Je passe sur les détails, il suffisait d'utiliser l'instruction MOVEM. |
− | Les registres seront |
+ | Les registres seront sauvés dans la pile système par mode prédécrémen- |
− | + | té et restaurés par mode postincrémenté.C'est tout ... |
|
TEXT |
TEXT |
||
Line 37: | Line 38: | ||
2) Exercice nr°2 |
2) Exercice nr°2 |
||
------------- |
------------- |
||
− | Voilà le listing de la macro HEXA, qui permet d'afficher en |
+ | Voilà le listing de la macro HEXA, qui permet d'afficher en hexadécimal |
le contenu de son paramètre. |
le contenu de son paramètre. |
||
Il faut d'abord atteindre sucessivement les 8 demi-octets qui |
Il faut d'abord atteindre sucessivement les 8 demi-octets qui |
||
− | composent le L-M |
+ | composent le L-M passé en paramètre (1 chiffre hexa=4 bits) |
Pour cela on utilise l'instruction de rotation ROL et on la place dans |
Pour cela on utilise l'instruction de rotation ROL et on la place dans |
||
une boucle. (LSR convenait aussi...) |
une boucle. (LSR convenait aussi...) |
||
Line 47: | Line 48: | ||
pour ne garder que le demi-octet à traiter. |
pour ne garder que le demi-octet à traiter. |
||
Le plus difficile vient ensuite: |
Le plus difficile vient ensuite: |
||
− | Il faut maintenant afficher la valeur de ce chiffre hexa |
+ | Il faut maintenant afficher la valeur de ce chiffre hexa codé par 4 bits |
− | à l' |
+ | à l'écran. |
Si le chiffre est <$A (donc <10) ce chiffre sera compris entre 0 et 9. |
Si le chiffre est <$A (donc <10) ce chiffre sera compris entre 0 et 9. |
||
En additionnant $30 à la valeur de ce chiffre on obtiendra le code ascii |
En additionnant $30 à la valeur de ce chiffre on obtiendra le code ascii |
||
− | du chiffre. (Car le code ascii de '0' est $30:celui de '1' est donc |
+ | du chiffre. (Car le code ascii de '0' est $30:celui de '1' est donc égal |
à $30+1=$31 etc...) |
à $30+1=$31 etc...) |
||
Si le chiffre hexa à afficher est >9 ce chiffre sera une lettre de l'alph- |
Si le chiffre hexa à afficher est >9 ce chiffre sera une lettre de l'alph- |
||
Line 57: | Line 58: | ||
En ajoutant $37+$A à la valeur de ce chiffre on obtiendra le code ascii |
En ajoutant $37+$A à la valeur de ce chiffre on obtiendra le code ascii |
||
du chiffre à afficher.(Car le code ascii de 'A' est $37+$A :celui de 'B' |
du chiffre à afficher.(Car le code ascii de 'A' est $37+$A :celui de 'B' |
||
− | est donc |
+ | est donc égal à $37+$B=$42 etc...) |
Il suffit ensuite d'afficher avec CCONOUT le code ascii ainsi obtenu et |
Il suffit ensuite d'afficher avec CCONOUT le code ascii ainsi obtenu et |
||
− | de recommencer l' |
+ | de recommencer l'opération avec tous les demi-octets du paramètre. |
NB:On utilise les macros SAUVE et RESTORE dans notre macro HEXA pour |
NB:On utilise les macros SAUVE et RESTORE dans notre macro HEXA pour |
||
Line 66: | Line 67: | ||
Vous remarquerez que j'utilise des LABELS dans la macro HEXA. |
Vous remarquerez que j'utilise des LABELS dans la macro HEXA. |
||
− | La macro ne pourra donc qu'ètre |
+ | La macro ne pourra donc qu'ètre utilisée 1 fois dans un listing car |
l'assembleur ne peut pas distinguer deux labels identiques et à |
l'assembleur ne peut pas distinguer deux labels identiques et à |
||
− | chaque appel d'une macro, celle-ci est |
+ | chaque appel d'une macro, celle-ci est reécrite entièrement... |
Vous pouvez cependant mettre la macro dans un sous-programme pour |
Vous pouvez cependant mettre la macro dans un sous-programme pour |
||
pouvoir l'appeller plusieurs fois... |
pouvoir l'appeller plusieurs fois... |
||
Line 85: | Line 86: | ||
rol.l d2,d3 ;fait une rotation de 4 bits |
rol.l d2,d3 ;fait une rotation de 4 bits |
||
andi.l #%1111,d3 ;et on masque ces 4 bits car seuls |
andi.l #%1111,d3 ;et on masque ces 4 bits car seuls |
||
− | ;eux doivent ètres |
+ | ;eux doivent ètres traités. |
; d3 contient donc la valeur à afficher: 0 à 9 ou A à F. (car un chiffre |
; d3 contient donc la valeur à afficher: 0 à 9 ou A à F. (car un chiffre |
||
− | ;hexa est |
+ | ;hexa est codé par 4 bits (voir introduction) ) |
cmpi.b #9,d3 |
cmpi.b #9,d3 |
||
Line 98: | Line 99: | ||
DECIMAL addi.b #$30,d3 ;d3=d3+$30 car la valeur ASCII de 0 est $30 |
DECIMAL addi.b #$30,d3 ;d3=d3+$30 car la valeur ASCII de 0 est $30 |
||
− | ;Donc si par exp. d3 vaut 1, on le |
+ | ;Donc si par exp. d3 vaut 1, on le représente |
;par le caractère ascii $30+1=$31='1', si il |
;par le caractère ascii $30+1=$31='1', si il |
||
;vaut 5, par le code ascii $30+5=$35='5',ainsi |
;vaut 5, par le code ascii $30+5=$35='5',ainsi |
||
;de suite pour tous les chiffres hexa <9 |
;de suite pour tous les chiffres hexa <9 |
||
− | CCONOUT d3 ; |
+ | CCONOUT d3 ;édition du contenu de d3 |
− | jmp DECAL ;on |
+ | jmp DECAL ;on redécale le paramètre et on continue |
;avec les 4 bits suivants en DECAL |
;avec les 4 bits suivants en DECAL |
||
− | HEX addi.b #$37,d3 ;d3=d3+$37 pour les nombres hexa |
+ | HEX addi.b #$37,d3 ;d3=d3+$37 pour les nombres hexa représentés |
;par les lettres car la valeur ASCII de A est |
;par les lettres car la valeur ASCII de A est |
||
;$37+$A.Donc si par exp. d3 vaut $B,on le re- |
;$37+$A.Donc si par exp. d3 vaut $B,on le re- |
||
− | ; |
+ | ;présente par le code ascii $37+$B=$42='B'... |
CCONOUT d3 ;on affiche la lettre (de A à F) |
CCONOUT d3 ;on affiche la lettre (de A à F) |
||
− | jmp DECAL ;on |
+ | jmp DECAL ;on redécale le paramètre et on continue |
;avec les 4 bits suivants en DECAL |
;avec les 4 bits suivants en DECAL |
||
− | FIN RESTORE ;quand on a fini l' |
+ | FIN RESTORE ;quand on a fini l'oppération avec tous les |
− | ;32 bits, on restore les registres |
+ | ;32 bits, on restore les registres empilés |
ENDM |
ENDM |
||
Line 131: | Line 132: | ||
Voilà la correction de la macro 'BINAIRE'. |
Voilà la correction de la macro 'BINAIRE'. |
||
− | Pour atteindre les 32 bits du paramètre et pour les afficher à l' |
+ | Pour atteindre les 32 bits du paramètre et pour les afficher à l'écran, |
on utilise l'instruction LSL.L #1,paramètre dans une boucle et suivant |
on utilise l'instruction LSL.L #1,paramètre dans une boucle et suivant |
||
la valeur du bit sorti, on affiche un '1' (bit actif) ou un '0' ( bit |
la valeur du bit sorti, on affiche un '1' (bit actif) ou un '0' ( bit |
||
Line 150: | Line 151: | ||
SAUVE ;sauvegarde des registres |
SAUVE ;sauvegarde des registres |
||
move.L \1,d1 ;le paramètre dans d1 |
move.L \1,d1 ;le paramètre dans d1 |
||
− | move #31,d3 ;compteur de boucle pour les |
+ | move #31,d3 ;compteur de boucle pour les décalages |
LOOK move #'0',d0 ;d0 contient le code ascii de 0 |
LOOK move #'0',d0 ;d0 contient le code ascii de 0 |
||
− | lsl.l #1,d1 ; |
+ | lsl.l #1,d1 ;décalage d'un bit de d1:Copie du bit dans |
;le code C du CCR |
;le code C du CCR |
||
bcc ZERO ;si le bit est nul (C=0):va en 'zero' |
bcc ZERO ;si le bit est nul (C=0):va en 'zero' |
||
Line 175: | Line 176: | ||
la piste à formater. |
la piste à formater. |
||
− | Pour demander une confirmation d' |
+ | Pour demander une confirmation d'éxecution à l'utilisateur du programme, |
on affiche un message d'alerte avec PRINTLINE, on attend qu'il enfonce |
on affiche un message d'alerte avec PRINTLINE, on attend qu'il enfonce |
||
une touche du clavier (avec 'WAIT') et on teste le code ascii de la |
une touche du clavier (avec 'WAIT') et on teste le code ascii de la |
||
− | touche |
+ | touche selectionnée. (valeur qui retourne dans d0) |
Si cette touche est 'F' on formate la disquette, sinon on quitte le prg |
Si cette touche est 'F' on formate la disquette, sinon on quitte le prg |
||
avec la macro TERM (fonction TERM du Gemdos). |
avec la macro TERM (fonction TERM du Gemdos). |
||
− | Si une erreur se produit durant le formatage (d0 |
+ | Si une erreur se produit durant le formatage (d0 négatif après FLOPFMT), |
on affiche le code d'erreur en DECIMAL. |
on affiche le code d'erreur en DECIMAL. |
||
Il faudra d'abord rendre le chiffre à traiter positif avec NEG dn. |
Il faudra d'abord rendre le chiffre à traiter positif avec NEG dn. |
||
Le chiffre à traiter (le code d'erreur) sera donc un nombre positif |
Le chiffre à traiter (le code d'erreur) sera donc un nombre positif |
||
− | et |
+ | et inférieur à 100 (cf. les codes d'erreur du Gemdos). |
On effectue une division par 10 de ce chiffre pour obtenir le chiffre |
On effectue une division par 10 de ce chiffre pour obtenir le chiffre |
||
des dixaines (avec DIVU #10,dn) du code d'erreur. |
des dixaines (avec DIVU #10,dn) du code d'erreur. |
||
Line 192: | Line 193: | ||
des dixaine, on l'affiche en lui ajoutant $30 pour obtenir un code ascii |
des dixaine, on l'affiche en lui ajoutant $30 pour obtenir un code ascii |
||
(avec CCONOUT). |
(avec CCONOUT). |
||
− | Le reste est dans le mot de poids fort de dn:Il |
+ | Le reste est dans le mot de poids fort de dn:Il représente le chiffre |
− | des |
+ | des unités du code d'erreur.On SWAP dn et on l'affiche lui aussi. |
− | Quand le formatage sera |
+ | Quand le formatage sera terminé, on affichera un message signalant que |
tout est OK. |
tout est OK. |
||
Line 203: | Line 204: | ||
vous regardez les informations conscernant la disquette en utili- |
vous regardez les informations conscernant la disquette en utili- |
||
sant l'option 'INFORMATIONS' du bureau GEM ,on vous indiquera qu'il |
sant l'option 'INFORMATIONS' du bureau GEM ,on vous indiquera qu'il |
||
− | reste 0 Octets de libre alors qu'il y en a aussi 0 d' |
+ | reste 0 Octets de libre alors qu'il y en a aussi 0 d'utilisés... |
− | Ceci s'explique par le fait que nous n'avons pas |
+ | Ceci s'explique par le fait que nous n'avons pas initialisé le |
− | BOOT SECTOR de la disquette:On ne pourra donc rien y |
+ | BOOT SECTOR de la disquette:On ne pourra donc rien y écrire car |
− | il contient toutes les informations |
+ | il contient toutes les informations nécessaires aux opérations de |
disk... |
disk... |
||
NB:Ceux qui ne possèdent pas PROFIMAT et qui veulent (doivent!) mettre |
NB:Ceux qui ne possèdent pas PROFIMAT et qui veulent (doivent!) mettre |
||
− | -- le tampon pour FLOPFMT à une adresse PAIRE ne doivent pas |
+ | -- le tampon pour FLOPFMT à une adresse PAIRE ne doivent pas écrire la |
DIRECTIVE :'ALIGN.W' en zone BSS. |
DIRECTIVE :'ALIGN.W' en zone BSS. |
||
− | Pour METACOMCO, il existe une DIRECTIVE |
+ | Pour METACOMCO, il existe une DIRECTIVE équivalente:CNOP 0,2 |
Pour DEVPAC ST: c'est la directive EVEN. |
Pour DEVPAC ST: c'est la directive EVEN. |
||
Les autres assemblerons le listing et si il ne marche pas, c'est que |
Les autres assemblerons le listing et si il ne marche pas, c'est que |
||
le tampon pour FLOPFMT n'est pas à une adresse paire. |
le tampon pour FLOPFMT n'est pas à une adresse paire. |
||
− | Il suffira alors de |
+ | Il suffira alors de réserver 1 OCTET juste devant le tampon:celui-ci |
passera donc d'une adresse impaire à une adresse paire (impaire+1). |
passera donc d'une adresse impaire à une adresse paire (impaire+1). |
||
Line 247: | Line 248: | ||
move.w #1,-(sp) ;interleave |
move.w #1,-(sp) ;interleave |
||
move.w #0,-(sp) ;face |
move.w #0,-(sp) ;face |
||
− | move.w d0,-(sp) ;d0=les |
+ | move.w d0,-(sp) ;d0=les différentes pistes |
move.w #9,-(sp) ;nb de secteurs par piste |
move.w #9,-(sp) ;nb de secteurs par piste |
||
move.w #0,-(sp) ;drive A |
move.w #0,-(sp) ;drive A |
||
Line 256: | Line 257: | ||
add.l #26,sp ;mise à jour de SP |
add.l #26,sp ;mise à jour de SP |
||
tst d0 |
tst d0 |
||
− | bmi ERROR ;Si d0 est |
+ | bmi ERROR ;Si d0 est négatif: erreur |
movem.l (sp)+,d0 ;on restore d0 |
movem.l (sp)+,d0 ;on restore d0 |
||
− | addi.b #1,d0 ;on |
+ | addi.b #1,d0 ;on incrémente le nr° de piste |
cmpi.b #80,d0 ;a-t-on les 80 pistes ? |
cmpi.b #80,d0 ;a-t-on les 80 pistes ? |
||
bne BOUCLE |
bne BOUCLE |
||
Line 267: | Line 268: | ||
TERM ;-> retour |
TERM ;-> retour |
||
− | ERROR move d0,d5 ;on sauve d0 dans d5 car d0 sera |
+ | ERROR move d0,d5 ;on sauve d0 dans d5 car d0 sera modifié |
PRINTLINE PROBLEME |
PRINTLINE PROBLEME |
||
neg d5 ;d5 devient positif |
neg d5 ;d5 devient positif |
||
Line 277: | Line 278: | ||
CCONOUT d5 ;on l'affiche |
CCONOUT d5 ;on l'affiche |
||
swap d5 ;d5.w faible=reste de la division=chiffre |
swap d5 ;d5.w faible=reste de la division=chiffre |
||
− | ;des |
+ | ;des unités de d5 |
add #$30,d5 ;chiffre=code ascii |
add #$30,d5 ;chiffre=code ascii |
||
CCONOUT d5 ;on l'affiche |
CCONOUT d5 ;on l'affiche |
||
Line 298: | Line 299: | ||
DS.B 20000 ;tampon en ammont de la nouvelle PILE |
DS.B 20000 ;tampon en ammont de la nouvelle PILE |
||
− | PILE DS.B 1 ;le formatage |
+ | PILE DS.B 1 ;le formatage nécessite beaucoup de place... |
ALIGN.W ;SPECIFIQUE à PROFIMAT !!!!! |
ALIGN.W ;SPECIFIQUE à PROFIMAT !!!!! |
||
TAMPON DS.B 10000 ;tampon pour le formatage (adresse PAIRE) |
TAMPON DS.B 10000 ;tampon pour le formatage (adresse PAIRE) |
||
Line 310: | Line 311: | ||
------------- |
------------- |
||
− | Voilà le programme qui rejoue les sons |
+ | Voilà le programme qui rejoue les sons crées avec PRO SOUND DESIGNER. |
Le programme va attendre qu'on enfonce une touche du clavier puis il |
Le programme va attendre qu'on enfonce une touche du clavier puis il |
||
Line 316: | Line 317: | ||
d0). |
d0). |
||
Les touches de Fonction n'ont pas de code ascii mais possèdent toutes |
Les touches de Fonction n'ont pas de code ascii mais possèdent toutes |
||
− | un SCANCODE qui les |
+ | un SCANCODE qui les différencies. |
− | Si l'octet de poids faible de d0 contient un code ascii (d0.w |
+ | Si l'octet de poids faible de d0 contient un code ascii (d0.w différent |
− | de 0), on quitte le prg car cela voudrait dire qu'on a |
+ | de 0), on quitte le prg car cela voudrait dire qu'on a enfoncé une autre |
touche qu'une des 10 touches de fonction. |
touche qu'une des 10 touches de fonction. |
||
− | Vous avez ensuite d— chercher les |
+ | Vous avez ensuite d— chercher les différents scancodes des touches de |
fonction pour pouvoir les utiliser ici. |
fonction pour pouvoir les utiliser ici. |
||
− | Pour cela, il suffisait d' |
+ | Pour cela, il suffisait d'écrire le programme suivant, |
TEXT |
TEXT |
||
Line 336: | Line 337: | ||
WAIT ;attente d'une touche |
WAIT ;attente d'une touche |
||
CCONOUT #27 |
CCONOUT #27 |
||
− | CCONOUT #'E' ;on efface l' |
+ | CCONOUT #'E' ;on efface l'écran |
jmp AA ;et on recommence |
jmp AA ;et on recommence |
||
END |
END |
||
− | puis de l'assembler ,de l' |
+ | puis de l'assembler ,de l'éxecuter et d'appuyer sur les touches de |
fonction pour noter leurs SCANCODES. |
fonction pour noter leurs SCANCODES. |
||
− | Le reste du programme doit identifier les |
+ | Le reste du programme doit identifier les différents scancodes des |
touches de fonction et jouer un son. |
touches de fonction et jouer un son. |
||
− | Pour tester les valeurs du scancode de la touche |
+ | Pour tester les valeurs du scancode de la touche enfoncée, on compare |
− | la valeur du scancode |
+ | la valeur du scancode rentré aux valeurs des 10 scancodes des touches |
− | de fonction que nous avons |
+ | de fonction que nous avons placé en zone DATA. |
En mème temps, on fait varier la valeur d'un registre d'adresse 'an' |
En mème temps, on fait varier la valeur d'un registre d'adresse 'an' |
||
− | qui pointe sur les |
+ | qui pointe sur les différentes adresses des sons. |
− | Si un scancode est |
+ | Si un scancode est identifié, on joue le son pointé par 'an' en le |
− | fournissant comme paramètre à la macro 'DOSOUND', sinon on |
+ | fournissant comme paramètre à la macro 'DOSOUND', sinon on incrémente |
− | les registres d'adresse (mode (an)+) pointant sur les DATAs qui |
+ | les registres d'adresse (mode (an)+) pointant sur les DATAs qui repré- |
sentent les scancodes et les adresses des sons. |
sentent les scancodes et les adresses des sons. |
||
Si finalement aucun scancode n'est reconnu, on recommence le test des |
Si finalement aucun scancode n'est reconnu, on recommence le test des |
||
− | touches du clavier au |
+ | touches du clavier au début du programme. |
− | Les |
+ | Les données définissant les sons se trouvent dans le fichier |
PROSOUND.DAT, il suffit de l'inclure en zone DATA dans le listing. |
PROSOUND.DAT, il suffit de l'inclure en zone DATA dans le listing. |
||
Line 365: | Line 366: | ||
-- move.b #0,$484) ceci dans le but d'arrèter le 'BIP' qui se fait |
-- move.b #0,$484) ceci dans le but d'arrèter le 'BIP' qui se fait |
||
entendre quand on appuye sur une touche afin de ne pas perturber |
entendre quand on appuye sur une touche afin de ne pas perturber |
||
− | le son |
+ | le son rejoué. |
Je parlerais bientot des VARIABLES SYSTEME... |
Je parlerais bientot des VARIABLES SYSTEME... |
||
Line 381: | Line 382: | ||
PRINTLINE message ;texte |
PRINTLINE message ;texte |
||
move.b #0,$484 ;variable système (mettre |
move.b #0,$484 ;variable système (mettre |
||
− | ;0 enlève |
+ | ;0 enlève répétition et |
;bip des touches) |
;bip des touches) |
||
TEZT WAIT ;attente d'une touche |
TEZT WAIT ;attente d'une touche |
||
;:CODE dans d0 |
;:CODE dans d0 |
||
− | tst.b d0 ;si code ascii |
+ | tst.b d0 ;si code ascii différent de |
bne STP ;0, alors SToP, sinon |
bne STP ;0, alors SToP, sinon |
||
swap d0 ;d0.w de poids faible |
swap d0 ;d0.w de poids faible |
||
Line 396: | Line 397: | ||
LISONS cmp.b (a0)+,d0 ;compare SCANCODE de la |
LISONS cmp.b (a0)+,d0 ;compare SCANCODE de la |
||
− | ;touche |
+ | ;touche enfoncée (d0) à |
;ceux de la table DC.B . |
;ceux de la table DC.B . |
||
− | move.l (a1)+,a5 ;Pose l'adresse |
+ | move.l (a1)+,a5 ;Pose l'adresse pointée par |
;a1 dans a5 |
;a1 dans a5 |
||
beq SON ;si CMP=oui, va jouer le |
beq SON ;si CMP=oui, va jouer le |
||
− | ;son |
+ | ;son pointé par a5 |
addq.b #1,d1 ;sinon ajoute 1 à d1 |
addq.b #1,d1 ;sinon ajoute 1 à d1 |
||
cmpi.b #9,d1 ;d1=9 ? |
cmpi.b #9,d1 ;d1=9 ? |
||
beq TEZT ;alors plus de scancodes |
beq TEZT ;alors plus de scancodes |
||
;et on revient en 'TEZT' |
;et on revient en 'TEZT' |
||
− | jmp LISONS ;sinon on |
+ | jmp LISONS ;sinon on incrémente a0 |
;et a1 |
;et a1 |
||
− | SON DOSOUND a5 ;Dosound le son |
+ | SON DOSOUND a5 ;Dosound le son pointé par |
;a5 |
;a5 |
||
jmp TEZT ;puis on revient en 'TEZT' |
jmp TEZT ;puis on revient en 'TEZT' |
||
Line 432: | Line 433: | ||
− | ; |
+ | ;Données définissant les sons de PRO SOUND DESIGNER |
sound0 DC.B 0,214 |
sound0 DC.B 0,214 |
||
Line 614: | Line 615: | ||
Il fallait simplement utiliser la macro 'SEARCH' et la fonction SEARCH- |
Il fallait simplement utiliser la macro 'SEARCH' et la fonction SEARCH- |
||
− | NEXT du gemdos qui |
+ | NEXT du gemdos qui délivrent dans le tampon DTA le nom du fichier et cer- |
tains autres renseignements conscernant le fichier reconnu. |
tains autres renseignements conscernant le fichier reconnu. |
||
Il fallait ensuite afficher le nom de chaque fichier reconnu: |
Il fallait ensuite afficher le nom de chaque fichier reconnu: |
||
Line 667: | Line 668: | ||
PILE DS.B 1 |
PILE DS.B 1 |
||
ALIGN.W ;SPECIFIQUE à PROFIMAT !!! |
ALIGN.W ;SPECIFIQUE à PROFIMAT !!! |
||
− | DTA DS.B 30 ; |
+ | DTA DS.B 30 ;début tampon |
DTANOM DS.B 14 ;ici DTA+30, le NOM du fichier |
DTANOM DS.B 14 ;ici DTA+30, le NOM du fichier |
||
ZERO DS.B 1 ;octet NUL pour PRINTLINE |
ZERO DS.B 1 ;octet NUL pour PRINTLINE |
||
Line 679: | Line 680: | ||
----------- |
----------- |
||
Voilà le listing d'un programme qui va parfaitement illuster les termes |
Voilà le listing d'un programme qui va parfaitement illuster les termes |
||
− | de PROGRAMME PERE et PROGRAMME FILS ainsi que les |
+ | de PROGRAMME PERE et PROGRAMME FILS ainsi que les possiblilités de |
chainage de programme gràce aux fonctions PEXEC et TERM du Gemdos. |
chainage de programme gràce aux fonctions PEXEC et TERM du Gemdos. |
||
Line 702: | Line 703: | ||
MESSAGE DC.B 27,'E',7,'Je vais charger le programme SON.PRG' |
MESSAGE DC.B 27,'E',7,'Je vais charger le programme SON.PRG' |
||
− | DC.B ' ,je resterais en |
+ | DC.B ' ,je resterais en mémoire et quand le',13,10 |
DC.B 'programme se terminera il me redonnera la ' |
DC.B 'programme se terminera il me redonnera la ' |
||
DC.B 'main car je suis le PRG PERE :',0 |
DC.B 'main car je suis le PRG PERE :',0 |
||
Line 727: | Line 728: | ||
Je vous signale que les macros instructions SAUVE,RESTORE,HEXA,BINAIRE |
Je vous signale que les macros instructions SAUVE,RESTORE,HEXA,BINAIRE |
||
− | sont |
+ | sont présentes dans le fichier MACROS_2.L et vous sont désormais entiè- |
rement disponibles. ---------- |
rement disponibles. ---------- |
||
Il existe aussi des PRG exemples utilisant ces macros instructions dans |
Il existe aussi des PRG exemples utilisant ces macros instructions dans |
||
Line 733: | Line 734: | ||
listing :EXEMPLE.L |
listing :EXEMPLE.L |
||
− | + | éxecutable:EXEMPLE.PRG |
|
Les listings complets des programmes issus des exercices nr°4,5,6 et du |
Les listings complets des programmes issus des exercices nr°4,5,6 et du |
||
− | programme Exemple ci-dessus sont |
+ | programme Exemple ci-dessus sont présents dans les fichiers: |
FORMAT.L |
FORMAT.L |
||
Line 743: | Line 744: | ||
PERE.L |
PERE.L |
||
− | ainsi que les programmes |
+ | ainsi que les programmes déjà assemblés: |
FORMAT.PRG |
FORMAT.PRG |
||
Line 766: | Line 767: | ||
</pre> |
</pre> |
||
Back to [[ASM_Tutorial]] |
Back to [[ASM_Tutorial]] |
||
− | [[Category: |
+ | [[Category: ASSEMBLEUR 68000 sur ATARI ST Part 2]] |
Latest revision as of 15:40, 17 December 2023
---------------------- CORRIGES DES EXERCICES NR°2 ---------------------- 1) Exercice nr°1 ------------- Voilà les listings des 2 macros instructions 'SAUVE' et 'RESTORE' qui permettent respectivement de sauvegarder et restaurer les registres du 68000. Je passe sur les détails, il suffisait d'utiliser l'instruction MOVEM. Les registres seront sauvés dans la pile système par mode prédécrémen- té et restaurés par mode postincrémenté.C'est tout ... TEXT SAUVE MACRO movem.l d0-d7/a0-a6,-(sp) ENDM RESTORE MACRO movem.l (sp)+,d0-d7/a0-a6 ENDM END 2) Exercice nr°2 ------------- Voilà le listing de la macro HEXA, qui permet d'afficher en hexadécimal le contenu de son paramètre. Il faut d'abord atteindre sucessivement les 8 demi-octets qui composent le L-M passé en paramètre (1 chiffre hexa=4 bits) Pour cela on utilise l'instruction de rotation ROL et on la place dans une boucle. (LSR convenait aussi...) On masquera ensuite les 4 bits de plus faible poids avec AND.L #%1111,dn pour ne garder que le demi-octet à traiter. Le plus difficile vient ensuite: Il faut maintenant afficher la valeur de ce chiffre hexa codé par 4 bits à l'écran. Si le chiffre est <$A (donc <10) ce chiffre sera compris entre 0 et 9. En additionnant $30 à la valeur de ce chiffre on obtiendra le code ascii du chiffre. (Car le code ascii de '0' est $30:celui de '1' est donc égal à $30+1=$31 etc...) Si le chiffre hexa à afficher est >9 ce chiffre sera une lettre de l'alph- abet (de A à F). En ajoutant $37+$A à la valeur de ce chiffre on obtiendra le code ascii du chiffre à afficher.(Car le code ascii de 'A' est $37+$A :celui de 'B' est donc égal à $37+$B=$42 etc...) Il suffit ensuite d'afficher avec CCONOUT le code ascii ainsi obtenu et de recommencer l'opération avec tous les demi-octets du paramètre. NB:On utilise les macros SAUVE et RESTORE dans notre macro HEXA pour -- pouvoir utiliser tous les registres sans modifier leur contenu à la fin de la macro. Vous remarquerez que j'utilise des LABELS dans la macro HEXA. La macro ne pourra donc qu'ètre utilisée 1 fois dans un listing car l'assembleur ne peut pas distinguer deux labels identiques et à chaque appel d'une macro, celle-ci est reécrite entièrement... Vous pouvez cependant mettre la macro dans un sous-programme pour pouvoir l'appeller plusieurs fois... TEXT HEXA MACRO $\1 ;macro à 1 paramètre SAUVE ;on sauve les registres pour ne pas ;perdre leur contenu move.l \1,d1 ;on pose le paramètre dans d1 moveq #0,d2 ;initialise le nombre de glissement DECAL addi.b #4,d2 ;on ajoute 4 au nb de glissements cmpi.b #36,d2 ;si d2=36=32+4=on a finit les 32 beq FIN ;rotations,dans ce cas -> FIN move.l d1,d3 ;sinon on pose d1 dans d3 et on rol.l d2,d3 ;fait une rotation de 4 bits andi.l #%1111,d3 ;et on masque ces 4 bits car seuls ;eux doivent ètres traités. ; d3 contient donc la valeur à afficher: 0 à 9 ou A à F. (car un chiffre ;hexa est codé par 4 bits (voir introduction) ) cmpi.b #9,d3 bgt HEX ;si d3 >9, on va en HEX car il faudra ;afficher une lettre et nom plus un ;chiffre... DECIMAL addi.b #$30,d3 ;d3=d3+$30 car la valeur ASCII de 0 est $30 ;Donc si par exp. d3 vaut 1, on le représente ;par le caractère ascii $30+1=$31='1', si il ;vaut 5, par le code ascii $30+5=$35='5',ainsi ;de suite pour tous les chiffres hexa <9 CCONOUT d3 ;édition du contenu de d3 jmp DECAL ;on redécale le paramètre et on continue ;avec les 4 bits suivants en DECAL HEX addi.b #$37,d3 ;d3=d3+$37 pour les nombres hexa représentés ;par les lettres car la valeur ASCII de A est ;$37+$A.Donc si par exp. d3 vaut $B,on le re- ;présente par le code ascii $37+$B=$42='B'... CCONOUT d3 ;on affiche la lettre (de A à F) jmp DECAL ;on redécale le paramètre et on continue ;avec les 4 bits suivants en DECAL FIN RESTORE ;quand on a fini l'oppération avec tous les ;32 bits, on restore les registres empilés ENDM END 3) Exercice nr°3 ------------- Voilà la correction de la macro 'BINAIRE'. Pour atteindre les 32 bits du paramètre et pour les afficher à l'écran, on utilise l'instruction LSL.L #1,paramètre dans une boucle et suivant la valeur du bit sorti, on affiche un '1' (bit actif) ou un '0' ( bit etteind). L'instruction de branchement conditionnel correspondant peut par exemple ètre bCC (Qui teste si le bit C du CCR est nul: LSL copie le bit sorti dans le bit C du CCR) Pour afficher le '1' ou le '0', on utilise la macro CCONOUT #'1' ou CCONOUT #'0'. NB:Mèmes remarques que pour la macro HEXA en ce qui conscerne l'utilisa- -- tion de labels dans la macro 'BINAIRE'. TEXT BINAIRE MACRO $\1 ;MACRO à 1 paramètre SAUVE ;sauvegarde des registres move.L \1,d1 ;le paramètre dans d1 move #31,d3 ;compteur de boucle pour les décalages LOOK move #'0',d0 ;d0 contient le code ascii de 0 lsl.l #1,d1 ;décalage d'un bit de d1:Copie du bit dans ;le code C du CCR bcc ZERO ;si le bit est nul (C=0):va en 'zero' move #'1',d0 ;sinon d0 contient le code ascii de '1' ZERO CCONOUT d0 ;on affiche le contenu de d0 (0 ou 1) dbf d3,LOOK ;on recommence avec les 31 autres bits RESTORE ;on restore les registres ENDM ;fini... END 4) Exercice nr°4: -------------- Voilà le listing du programme qui permet de formater une disquette. Il suffisait d'utiliser correctement la fonction FLOPFMT du Gemdos et de la mettre dans une boucle pour pouvoir faire varier le nr° de la piste à formater. Pour demander une confirmation d'éxecution à l'utilisateur du programme, on affiche un message d'alerte avec PRINTLINE, on attend qu'il enfonce une touche du clavier (avec 'WAIT') et on teste le code ascii de la touche selectionnée. (valeur qui retourne dans d0) Si cette touche est 'F' on formate la disquette, sinon on quitte le prg avec la macro TERM (fonction TERM du Gemdos). Si une erreur se produit durant le formatage (d0 négatif après FLOPFMT), on affiche le code d'erreur en DECIMAL. Il faudra d'abord rendre le chiffre à traiter positif avec NEG dn. Le chiffre à traiter (le code d'erreur) sera donc un nombre positif et inférieur à 100 (cf. les codes d'erreur du Gemdos). On effectue une division par 10 de ce chiffre pour obtenir le chiffre des dixaines (avec DIVU #10,dn) du code d'erreur. Le quotient retourne dans le mot de poids faible de dn: c'est le chiffre des dixaine, on l'affiche en lui ajoutant $30 pour obtenir un code ascii (avec CCONOUT). Le reste est dans le mot de poids fort de dn:Il représente le chiffre des unités du code d'erreur.On SWAP dn et on l'affiche lui aussi. Quand le formatage sera terminé, on affichera un message signalant que tout est OK. Remarque: --------- ATTENTION, notre programme va bien formater la disquette, mais si vous regardez les informations conscernant la disquette en utili- sant l'option 'INFORMATIONS' du bureau GEM ,on vous indiquera qu'il reste 0 Octets de libre alors qu'il y en a aussi 0 d'utilisés... Ceci s'explique par le fait que nous n'avons pas initialisé le BOOT SECTOR de la disquette:On ne pourra donc rien y écrire car il contient toutes les informations nécessaires aux opérations de disk... NB:Ceux qui ne possèdent pas PROFIMAT et qui veulent (doivent!) mettre -- le tampon pour FLOPFMT à une adresse PAIRE ne doivent pas écrire la DIRECTIVE :'ALIGN.W' en zone BSS. Pour METACOMCO, il existe une DIRECTIVE équivalente:CNOP 0,2 Pour DEVPAC ST: c'est la directive EVEN. Les autres assemblerons le listing et si il ne marche pas, c'est que le tampon pour FLOPFMT n'est pas à une adresse paire. Il suffira alors de réserver 1 OCTET juste devant le tampon:celui-ci passera donc d'une adresse impaire à une adresse paire (impaire+1). TEXT INCLUDE "INIT_TOS.L" INCLUDE "MACROS.L" SETBLOCK PRINTLINE ATTENTION ;le message d'alerte WAIT ;attente d'une touche:code ascii dans d0 CMPI.B #'F',d0 ;d0='F' ? BEQ FORMAT ;alors FORMAT CMPI.B #'f',d0 ;d0='f' ? BEQ FORMAT ;alors FORMAT TERM ;sinon quitter FORMAT SUPER ;mode SUPERVISEUR clr.l d0 BOUCLE movem.l d0,-(sp) ;on sauvegarde juste d0 move.w #$e5e5,-(sp) ;virgin move.l #$87654321,-(sp) ;mot magic move.w #1,-(sp) ;interleave move.w #0,-(sp) ;face move.w d0,-(sp) ;d0=les différentes pistes move.w #9,-(sp) ;nb de secteurs par piste move.w #0,-(sp) ;drive A clr.l -(sp) ;l-m=0 pea TAMPON ;adresse du tampon move.w #$a,-(sp) ;Flopfmt trap #14 add.l #26,sp ;mise à jour de SP tst d0 bmi ERROR ;Si d0 est négatif: erreur movem.l (sp)+,d0 ;on restore d0 addi.b #1,d0 ;on incrémente le nr° de piste cmpi.b #80,d0 ;a-t-on les 80 pistes ? bne BOUCLE PRINTLINE OK ;pas de probleme, OK GO WAIT ;attente d'une touche USER ;on revient en mode USER TERM ;-> retour ERROR move d0,d5 ;on sauve d0 dans d5 car d0 sera modifié PRINTLINE PROBLEME neg d5 ;d5 devient positif ; affichage DECIMAL de d5 divu #10,d5 ;chiffre des dixaines dans d5.w faible add #$30,d5 ;chiffre=code ascii CCONOUT d5 ;on l'affiche swap d5 ;d5.w faible=reste de la division=chiffre ;des unités de d5 add #$30,d5 ;chiffre=code ascii CCONOUT d5 ;on l'affiche jmp GO ;--> fin DATA ATTENTION DC.B 27,'E','DANGER ! Ce programme FORMATE la disquette,' DC.B ' inserez une disquette VIERGE puis',10,13,'pressez' DC.B ' [F] pour FORMATER la disquette ...' DC.B ' (Ou une autre touche pour QUITTER!)',7,0 OK DC.B 27,'E','Pas d',39,'erreur : OK...',0 PROBLEME DC.B 27,'E',7,'ERREUR de code :-',0 BSS DS.B 20000 ;tampon en ammont de la nouvelle PILE PILE DS.B 1 ;le formatage nécessite beaucoup de place... ALIGN.W ;SPECIFIQUE à PROFIMAT !!!!! TAMPON DS.B 10000 ;tampon pour le formatage (adresse PAIRE) SAUV_SP DS.L 1 ;tampon pour SUPER et USER END 5) Exercice nr°5 ------------- Voilà le programme qui rejoue les sons crées avec PRO SOUND DESIGNER. Le programme va attendre qu'on enfonce une touche du clavier puis il la teste (Macro 'WAIT' du gemdos, retour du code et du scancode dans d0). Les touches de Fonction n'ont pas de code ascii mais possèdent toutes un SCANCODE qui les différencies. Si l'octet de poids faible de d0 contient un code ascii (d0.w différent de 0), on quitte le prg car cela voudrait dire qu'on a enfoncé une autre touche qu'une des 10 touches de fonction. Vous avez ensuite d— chercher les différents scancodes des touches de fonction pour pouvoir les utiliser ici. Pour cela, il suffisait d'écrire le programme suivant, TEXT INCLUDE "MACROS.L" AA WAIT ;attente d'une touche SWAP d0 ;d0.b de poids faible = scancode and.l #$FF,d0 ;on ne garde que l'octet de poids faible de ;ce mot (soit le SCANCODE) HEXA d0 ;affichage en HEXA du scancode WAIT ;attente d'une touche CCONOUT #27 CCONOUT #'E' ;on efface l'écran jmp AA ;et on recommence END puis de l'assembler ,de l'éxecuter et d'appuyer sur les touches de fonction pour noter leurs SCANCODES. Le reste du programme doit identifier les différents scancodes des touches de fonction et jouer un son. Pour tester les valeurs du scancode de la touche enfoncée, on compare la valeur du scancode rentré aux valeurs des 10 scancodes des touches de fonction que nous avons placé en zone DATA. En mème temps, on fait varier la valeur d'un registre d'adresse 'an' qui pointe sur les différentes adresses des sons. Si un scancode est identifié, on joue le son pointé par 'an' en le fournissant comme paramètre à la macro 'DOSOUND', sinon on incrémente les registres d'adresse (mode (an)+) pointant sur les DATAs qui repré- sentent les scancodes et les adresses des sons. Si finalement aucun scancode n'est reconnu, on recommence le test des touches du clavier au début du programme. Les données définissant les sons se trouvent dans le fichier PROSOUND.DAT, il suffit de l'inclure en zone DATA dans le listing. NB:Je modifie la valeur d'une VARIABLE SYSTEME dans ce listing (avec -- move.b #0,$484) ceci dans le but d'arrèter le 'BIP' qui se fait entendre quand on appuye sur une touche afin de ne pas perturber le son rejoué. Je parlerais bientot des VARIABLES SYSTEME... TEXT INCLUDE "INIT_TOS.L" INCLUDE "MACROS.L" SETBLOCK SUPER ;mode SUPERVISEUR PRINTLINE message ;texte move.b #0,$484 ;variable système (mettre ;0 enlève répétition et ;bip des touches) TEZT WAIT ;attente d'une touche ;:CODE dans d0 tst.b d0 ;si code ascii différent de bne STP ;0, alors SToP, sinon swap d0 ;d0.w de poids faible ;devient le SCANCODE lea FONCT,a0 ;a0=adresse des SCANCODES lea VECTEUR,a1 ;a1=adresse des adresses ;des sons de VECTEUR LISONS cmp.b (a0)+,d0 ;compare SCANCODE de la ;touche enfoncée (d0) à ;ceux de la table DC.B . move.l (a1)+,a5 ;Pose l'adresse pointée par ;a1 dans a5 beq SON ;si CMP=oui, va jouer le ;son pointé par a5 addq.b #1,d1 ;sinon ajoute 1 à d1 cmpi.b #9,d1 ;d1=9 ? beq TEZT ;alors plus de scancodes ;et on revient en 'TEZT' jmp LISONS ;sinon on incrémente a0 ;et a1 SON DOSOUND a5 ;Dosound le son pointé par ;a5 jmp TEZT ;puis on revient en 'TEZT' STP USER ;mode UTILISATEUR TERM ;on quitte DATA MESSAGE DC.B 27,'E','Voilà des sons de PRO SOUND DESIGNER' DC.B ', tapez sur les touches de Fonction :',13,10 DC.B '(Ou une autre touche pour sortir )',7,0 VECTEUR DC.L sound0,sound1,sound2,sound3,sound4,sound5 DC.L sound6,sound7,sound8,sound9 ;les adresses des 10 sons. FONCT DC.B $3B,$3C,$3D,$3E,$3F,$40,$41,$42,$43,$44 ;les scancodes des touches de fonction (F1->F10) ;Données définissant les sons de PRO SOUND DESIGNER sound0 DC.B 0,214 DC.B 1,0 DC.B 2,215 DC.B 3,0 DC.B 4,215 DC.B 5,0 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound1 DC.B 0,24 DC.B 1,1 DC.B 2,25 DC.B 3,1 DC.B 4,23 DC.B 5,1 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound2 DC.B 0,156 DC.B 1,1 DC.B 2,156 DC.B 3,1 DC.B 4,156 DC.B 5,1 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound3 DC.B 0,22 DC.B 1,2 DC.B 2,21 DC.B 3,2 DC.B 4,23 DC.B 5,2 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound4 DC.B 0,55 DC.B 1,3 DC.B 2,59 DC.B 3,3 DC.B 4,57 DC.B 5,3 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound5 DC.B 0,235 DC.B 1,3 DC.B 2,234 DC.B 3,3 DC.B 4,232 DC.B 5,3 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound6 DC.B 0,70 DC.B 1,5 DC.B 2,72 DC.B 3,5 DC.B 4,71 DC.B 5,5 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound7 DC.B 0,84 DC.B 1,7 DC.B 2,84 DC.B 3,7 DC.B 4,84 DC.B 5,7 DC.B 7,248 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,2 DC.B 0,0 DC.B 255,0 sound8 DC.B 0,175 DC.B 1,0 DC.B 2,193 DC.B 3,4 DC.B 4,20 DC.B 5,6 DC.B 7,254 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,0 DC.B 93,63 DC.B 255,0 sound9 DC.B 0,175 DC.B 1,0 DC.B 2,193 DC.B 3,4 DC.B 4,232 DC.B 5,4 DC.B 7,254 DC.B 8,16 DC.B 9,16 DC.B 10,16 DC.B 11,32 DC.B 12,73 DC.B 13,0 DC.B 129,0 DC.B 80,88 DC.B 255,0 BSS DS.B 40000 ;pour SETBLOCK PILE DS.B 1 SAUV_SP DS.L 1 ;pour SUPER/USER END 6) Exercice 6 ---------- Voilà le programme qui permet de visualiser le directory d'une disquette. Il fallait simplement utiliser la macro 'SEARCH' et la fonction SEARCH- NEXT du gemdos qui délivrent dans le tampon DTA le nom du fichier et cer- tains autres renseignements conscernant le fichier reconnu. Il fallait ensuite afficher le nom de chaque fichier reconnu: Le nom se trouve en DTA+30, pour l'afficher on utilise la macro PRINTLINE. NB:Mèmes remarques que pour le listing nr°4 conscernant l'adresse PAIRE -- du tampon DTA. TEXT INCLUDE "INIT_TOS.L" INCLUDE "MACROS.L" SETBLOCK PRINTLINE DIR ;message SEARCH DTA,#0,PRG ;installe DTA,cherche le prg (L/E) tst d0 ;erreur ? bne FIN ;si ? alors FIN PRINTLINE DTANOM ;en DTANOM se trouve le nom du fichier CCONOUT #13 ;on saute une ligne CCONOUT #10 ;on revient colonne 1 BOUCLE move #$4f,-(SP) ;SEARCH-NEXT trap #1 addq.l #2,SP tst d0 ;encore des prg ? bne FIN ;non ?! Alors FIN PRINTLINE DTANOM ;on affiche le nom du prg CCONOUT #13 ;on saute une ligne CCONOUT #10 ;on revient à la colonne 1 jmp BOUCLE ;et on continue FIN PRINTLINE FINI ;message WAIT ;attente TERM ;salut !! DATA PRG DC.B 'A:\*.*',0 ;= TOUS les fichiers DIR DC.B 27,'E','LE DIRECTORY DE CETTE DISQUETTE EST:',10,13,0 FINI DC.B 13,10,7,'Voilà pour cette Disquette...',0 BSS DS.B 2000 PILE DS.B 1 ALIGN.W ;SPECIFIQUE à PROFIMAT !!! DTA DS.B 30 ;début tampon DTANOM DS.B 14 ;ici DTA+30, le NOM du fichier ZERO DS.B 1 ;octet NUL pour PRINTLINE END PETIT PLUS: ----------- Voilà le listing d'un programme qui va parfaitement illuster les termes de PROGRAMME PERE et PROGRAMME FILS ainsi que les possiblilités de chainage de programme gràce aux fonctions PEXEC et TERM du Gemdos. TEXT INCLUDE "INIT_TOS.L" INCLUDE "MACROS.L" SETBLOCK PRINTLINE MESSAGE ;texte WAIT ;attente PRINTLINE EFFACE ;texte PEXEC ZERO,NUL,PRG,#0 ;Pexec en mode 0 PRINTLINE RETOUR ;texte WAIT ;attente TERM ;retour DATA MESSAGE DC.B 27,'E',7,'Je vais charger le programme SON.PRG' DC.B ' ,je resterais en mémoire et quand le',13,10 DC.B 'programme se terminera il me redonnera la ' DC.B 'main car je suis le PRG PERE :',0 EFFACE DC.B 27,'E','je charge mon PRG FILS :',0 RETOUR DC.B 27,'E','PRG PERE: COUCOU !!! me revoilà ...',0 NUL DC.B 0 ;pas d'environnenment ZERO DC.B 0 ;pas de ligne de commande PRG DC.B 'A:\SON.PRG',0 ;nom du programme FILS BSS DS.B 200 ;pour SETBLOCK PILE DS.B 1 END ------------------- Voilà pour les corrections. Je vous signale que les macros instructions SAUVE,RESTORE,HEXA,BINAIRE sont présentes dans le fichier MACROS_2.L et vous sont désormais entiè- rement disponibles. ---------- Il existe aussi des PRG exemples utilisant ces macros instructions dans les fichiers: listing :EXEMPLE.L éxecutable:EXEMPLE.PRG Les listings complets des programmes issus des exercices nr°4,5,6 et du programme Exemple ci-dessus sont présents dans les fichiers: FORMAT.L SON.L DIR.L PERE.L ainsi que les programmes déjà assemblés: FORMAT.PRG SON.PRG DIR.PRG PERE.PRG Tous ces fichiers sont sur la disquette nr° 1. ---------------------------------------------- PIECHOCKI Laurent 8,impasse Bellevue Suite dans le fichier:VDI.DOC 57980 TENTELING -------
Back to ASM_Tutorial