Voici une partie des pages paires du guide utilisateur !

ORGAMS 30 June 2019
-------------------

::::::::::::::::::::::::
: Prise en main rapide :
::::::::::::::::::::::::

 - RUN"#BURN" (Il n'y a qu'une version ROM)
 - |ORG puis ESC ou |O pour acc{der directement @ l'{diteur.
 - CONTROL-I (Import) Permet de lire un source DAMS, Maxam (ASCII) ou  èTurboAss (export ASCII).
 - CONTROL-1 Pour assembler.
 - ESPACE    Pour revenir @ l'{diteur.
 - CONTROL-4 Pour cycler parmi les erreurs.
 - CONTROL-S pour sauvegarder. CONTROL-O pour ouvrir.
 - CONTROL-2 Pour assembler & ex{cuter (attention ENT par d{faut en  è#9000).
 - CONTROL-H Pour aide en ligne, disponible dans l'{diteur, le moniteur et  èla trace.

:::::::::::::::::
: Pr{sentation :
:::::::::::::::::

A l'instar de DAMS, Orgams se d{compose en :
 - Editeur (avec validation @ la vol{e des lignes saisies)
 - Moniteur (aka Monogams)
 - D{bogueur (d{sassemblage, trace pas @ pas, etc...)

Orgams est tr}s gourmand, croque la vie @ pleines dents, et sa taille s'en  èressent. Il occupe 3 ROMs :
 - ORGAMS.ROM : Rom de base @ placer de 1 @ 15 (ou jusqu'@ 31 avec le  èfirmware ad{quat).
 - ORGEXT.ROM : Rom d'extension @ placer de 1 @ 127.
 - MONOGAMS.ROM : Moniteur @ placer de 1 @ 127.

Plusieurs banks se voient monopolis{es (de fa\on d{croissante), la bank de  èbase (bkBase) {tant :
 - C7 avec 128k
 - FF avec 512k (autorise la cohabitation avec un RAM-DISK 256k).
Puis bkBase-1 est utilis{ pour le miroir syst}me/m{moire de travail.
Le source d{bute en bkBase-2.

::::::::::::::::::::::
: Flux entre modules :
::::::::::::::::::::::

Ici, "**Exec**" repr{sente le programme assembl{ en cours d'ex{cution.

 **Basic**
 - |ORGAMS : va au moniteur en effa\ant le source.
 - |ORG, |M : synonymes, va au moniteur sans effacer le source.
 - |O : va @ l'{diteur sans effacer le source.

 **Monitor**
 - ESC : Goto **Ed**
 - Control-B : Retour Basic.
 - commande 'Dexp' : Goto **Debugueur**

 **Ed**
 - CTRL-F2 : Si ok, Goto **Exec**
 - ESC : Goto **Monitor**

 **Exec**
 - ret : comme RESTORE (mais la pile doit etre valable) (*)
 - RESTORE : restaure syst}me et Goto **Ed**.
 - BRK / rst #30 / call #be00'' : Goto **Trace**

 **D{bogueur**
 - ESC : Goto **Monitor**
 - CONTROL-ESC : Goto **Editeur** @ la ligne visualis{e.
 - J : Goto **Exec**

Exemple de session de programmation :

 - Peaufinage d'opcodes via l'{diteur. CONTROL-4 permet d'aller  èdirectement sur les erreurs point{es lors de l'assemblage (CONTROL-1).
 - Plutot qu'un bete RET, utilisez RESTORE or BRK pour sortir de votre  èprogramme.
 - Sauvegarde du source.
 - Test par CONTROL-2 : cela assemble le code, puis lance le programme.
 - Le moniteur permet d'{tudier toute la m{moire (except{ la m{moire  è{cran, {cras{e par Orgams meme).

(*) **Meme avec un simple RET, Orgams restaure le syst}me. Nul besoin de  èsauvegarder les registres secondaires, le saut en &38, ou quoi que ce  èsoit.**

:::::::::::
: Editeur :
:::::::::::

On entre dans l'{diteur par |O depuis le basic, ou avec ESC depuis  èMonogams.
On en sort avec ESC, en lan\ant l'assemblage + ex{cution (CTRL 2), ou  èencore en appuyant sur l'interrupteur du disjoncteur.

La session en cours persiste @ travers les resets, avec v{rification de  èvalidit{ du source.

Import
######

La premi}re chose que vous voudrez faire, c'est {couter 6:33.
La seconde sera d'importer vos anciens sources tout miteux (cf "R{diger un  èmanuel technique pour les nuls" : cr{er des "histoires utilisateurs").
Via CONTROL-I, Orgams reconnait automatiquement les sources DAMS et les  èsources ASCII (TurboASS, Maxam ou ORGAMS). Les diff{rents ajustements   èartie du pr{-assem devient 'FILLR00,nbCols MOD 3'

L'op{ration est tr}s lente, car une bonne partie du pr{-assem devient  è'FILL 100,nbCols MOD 3'

L'op{ration est tr}s lente, car une bonne partie du pr{-assemblage et  èr{solution des symboles se fait @ ce moment.

Diff{rences possibles. **!!ATTENTION!!**
=========================================

 Expressions arithm{tiques modifi{es.
---------------------------------------

Exemple :

 - LD A,pal&#ff+1  ; (pal and #ff) + 1

Devient :

 - LD A,pal AND #ff+1 ; pal and #100

En effet, comme #ff+1 est visuellement group{, il est calcul{ @ part.
Il faut corriger, au choix :

 - LD A,pal AND #ff + 1  ; Ordre gauche vers droite
 - LD A,[pal AND #ff]+1

 Comportement ORG
-----------------

Quand DAMS assemble avec A2, chaque ORG change le PC ($) mais pas  èl'adresse de stockage ($$). Cependant ORGAMS ne permet pas ce mode. Pour  èle reproduire, il faudra explicitement remplacer :

 - (DAMS)   ORG dest
 - (ORGAMS) ORG dest,$$

 DEFS @ 1 param}tre
---------------------

Le 'DEFS size' de DAMS est remplac{ par 'F size', qui aboutit @ une erreur  ède syntaxe.
En effet, 'F' est reconnu comme 'FILL', mais seulement quand suivi de ses  è2 param}tres obligatoires.
Avec un seul param}tre, DAMS saute l'espace indiqu{ sans l'initialiser. Il  èn'y a pas d'{quivalent dans ORGAMS. Il faut donc {crire explicitement 'F  èsize,0' (remplac{ automatiquement par 'FILL size,0').

V{rification
=============

Dans Monogams, utilisez la commande X pour comparer le code assembl{ avec  èvotre code r{f{rence.


Limitations
###########

 - L'{dition des lignes est limit{e @ 72 caract}res. Si on vous demande  èpourquoi, vous direz que vous ne savez pas.

Raccourcis clavier
##################

Les raccourcis clavier sont d{crits dans l'aide en ligne (maintenir  èCONTROL-H).
On s'attarde ici sur les plus sophistiqu{s.

CTRL + C Affiche le catalogue de la disquette.
==============================================

CTRL L + **str** (TAB pour continuer la recherche)
==================================================

Va directement au prochain label commen\ant par "str". C'est l'{quivalent  ède la commande 'l' de DAMS, avec les am{liorations suivantes :
 - Insensible @ la casse
 - Permet d'it{rer tous les labels commen\ant par "str". Il suffit de r{- èappuyer CTRL L puis RETURN pour aller au suivant, ou simplement appuyer  èsur TAB.

CTRL *  (TAB pour continuer la recherche)
=========================================

Va @ la prochaine occurence du label sous le curseur (r{miniscence VI).
S'il n'y a pas de label sous le curseur, on prend le premier label @  èpartir de cette position, c'est @ dire le plus proche @ droite(*). S'il  èn'y a pas de tel label, on prend le plus proche @ gauche.

E.g.

fx_dispatch  call routine ; CTRL-* ira @ la prochaine occurence de  è'fx_dispatch' si le curseur est dessus
                          ; ou @ la prochaine occurence de 'routine' dans  ètous les autres cas.


(*) Pourquoi le label @ droite ? Un article publi{ dans "Psychological  èScience in the Public Interest" montre une tendance @ focaliser sur le  èlabel suivant le curseur plutot que celui le pr{c{dant. Cet effet est  èamplifi{ si le curseur p
ointe une instruction (e.g. 'call'), mais invers{  èquand le cobaye vient de lire un verset du coran.


CTRL Enter
==========

Va @ la d{finition du label sous le curseur.
Si ce dernier est lui meme une d{finition, alors on prend le suivant.
S'il n'y a pas de label sous le curseur, meme m{canisme de s{lection que  èpour CONTROL-*

E.g.

fx_dispatch  call display3D     ; CTRL-ENTER ira @ 'display3D' quelque  èsoit la position du curseur


L'essayer, c'est l'adopter, comme on dit au Danemark.

CTRL Return
===========

Retourne @ position pr{c{dente (apr}s CTRL Enter). Cela marche sur 8  èniveaux.
Comme je ne suis pas chien (*), je vous donne un truc mn{motechnique :  è"Enter routine", "Return from routine".

(*) Non pas que les chiens soient mesquins, mais ils {crivent rarement des  èguides utilisateurs.

CTRL M
======

Cycle parmi les 8 derni}res lignes modifi{es. Tr}s pratique, je trouve,  èapr}s s'etre balad{ dans le source pour revenir l@ o| on en {tait.

SHIFT CLR
=========

Efface tout en partant du curseur (comme si vous appuyiez sur CLR tel un  èmalade).

SHIFT DEL erase all before cursor
=================================

Efface tout pr{c{dant le curseur.

CTRL DEL
========

Efface toute la ligne.

CTRL P
======

Colle la derni}re ligne supprim{e avec CTRL-DEL. Fait office d'UNDO  èrustique, mais permet aussi de dupliquer une ligne plus rapidement qu'avec  èles blocs. Dans ce cas, il faut effacer pour mieux r{-ins{rer !

CTRL F (Find)  (TAB pour continuer la recherche)
================================================

Recherche texte.

 - Non sensible @ la casse
 - Indiff{rent aux tabulations  (contrairement @ TurboAss o| il faut  èsaisir le nombre d'espaces exact pour rechercher les mn{moniques avec  èop{randes).
 - Par d{faut, recherche exhaustive.
 * Pr{c{der la chaine @ rechercher par un espace si l'on souhaite  èrechercher seulement en d{but de mots.
 * Faire suivre la chaine @ rechercher par un espace si l'on souhaite  èrechercher seulement en fin de mots.
 * Encadrer la chaine @ rechercher par des espaces si l'on souhaite  èrechercher le mot exact isol{ment.
 * Dans tous ces cas, l'espace au d{but et @ la fin n'est pas cherch{  èlitt{ralement, comme le montrent les exemples suivant.

>--------!-------!-------!-------!-------!-------!-------!-------!-------------R

: v Cherch{ / Dans source ->: OR A : LD HL,orgy : LD HL,thor : LD HL,bord :
: "or"                       : *    :       *    :         *  :        *   :
: " or"                      : *    :       *    :            :            :
: "or "                      : *    :            :         *  :            :
: " or "                     : *    :            :            :            :

>--------!-------!-------!-------!-------!-------!-------!-------!-------R

Raccourcis Assembleur
#####################

On r{serve CONTROL+chiffre pour les raccourcis assembleur (a priori moins  ènombreux). Ce permet :

 - D'{tendre plus facilement les uns et les autres, sans risque de  èconflit.
 - De les m{moriser/utiliser plus efficacement (moins d'interf{rences  ècognitives, pour parler comme mon concierge).

**CONTROL-1** : Assemble
========================
**CONTROL-2** : Assemble+jump
=============================
**CONTROL-4** : Va @ l'erreur d'assemblage suivante.
=====================================================

Ces raccourcis sont r{alisables d'une main, lib{rant l'autre pour fumer un  ècubain.

Le lancement du programme assembl{ se fait sous DI, en connexion RAM  èstandard (&C0) et en remettant SP @ C000, avec des valeurs correctes pour  èle syst}me en AF' et BC'.


::::::::::
: Source :
::::::::::

Il est pr{-assembl{.
 - Facilite la d{tection des erreurs d}s la saisie.
 - Identification du label @ l'{dition plutot qu'@ l'assemblage :  èessentiel pour assemblage ultra-rapide.
 - Code beaucoup plus compact.
 - R{duit le besoin de fichier 'objet' (code assembl{ muni des infos  èn{cessaires pour le reloger et/ou pour acc{der @ ses routines).
 - Il reste la possibilit{ d'importer/exporter une version ASCII.
 - A l'affichage, impose casse (pour les opcodes / directives) et  ètabulation. C'est aussi un avantage : uniformit{ du code sans avoir @ le  èformater @ la main !

Directives de compilation
#########################

Org X [,Y]
==========

Ou comment g{n{rer @ une adresse Y du code destin{ @ etre ex{cut{ en X.

On distingue :
  * pointeur code (pseudo label $), l'adresse o| le code est cens{  ès'ex{cuter (ie $ joue @ peu pr}s le role de PC)
  * pointeur objet (pseudo label $$), l'adresse o| le code est stock{ par  èl'assembleur.

Dans le sc{nario le plus fr{quent, les deux coincident, et l'instruction  è''ORG X'' permet de changer cette adresse.
Utilis{ avec 2 param}tres, ORG fixe $ et $$ s{par{ment.

Le code suivant :

     ORG #1000, #2000
loop JP  loop

g{n{rera le code ''C3 00 10'' @ l'adresse #2000.

Pour changer uniquement $ :

message byte "Hello dad!",0
      ORG #C000, $$
     ; le code est stock{ apr}s message
toto      ;ce label vaut #C000



Pour changer uniquement $$ :

     ORG $, #4000


 Alignement m{moire
--------------------

Pour aligner du code @ un multiple donn{ (typiquement, multiple de #100),  èon peut le copier lors de l'ex{cution @ une telle adresse. C'est la  èsolution du pauvre. Souvent, on aimerait que le code g{n{r{ soit d{j@  èalign{.

Il existe deux alternatives :


   [...] ; some code
   ORG $+#ff and #ff00
rout01  ;vaut XX00

   [...] ; some code
   FILL -$ and #ff,0
rout02  ;vaut YY00
   [...]


 Bug connu
----------

Le code assembl{ en &30-&32 se voit {cras{ par JP &BE00 (m{canisme  èbreakpoint).

ALIGN(n)  (example MACRO)
=========================

Avance $ au plus proche multiple de n.
Si $ est d{j@ un multiple de n, la directive est sans effet.

NB: $$ est incr{ment{ de la meme valeur.

ALIGN n'est pas une directive int{gr{e, et peut etre simul{e par :


  MACRO ALIGN n
    SKIP -$ MOD n
  ENDM


Explication :
  On veut sauter x octets tels que ''$+x = 0 [n]'' et ''0 <= x < n''
  Cela revient @ ''x = -$ MOD n''

ASSERT(pr{dicat)   (exemple MACRO)
===================================

Provoque une erreur d'assemblage si le pr{dicat est faux (0 en pratique).

ASSERT n'est pas une directive int{gr{e. Elle peut etre simul{e par :


  MACRO ASSERT predicate
    IF predicate:ELSE
   !! ERROR !!
  END
  ENDM


Explication:
  La line '!! ERROR !!' n'est pas assembl{e du tout si le pr{dicat est  èvrai, et provoque une erreur sinon.

Exemple 2:


  MACRO ASSERT_NOT predicate
    IF predicate
 !! ERROR !!
    END
  ENDM

  [...]

  ASSERT_NOT (my_table AND &ff) ; Garantie que my_table est de la forme  èxx00


 Limitation
-----------

  La ligne d'erreur pointe sur le corps de la macro, pas sur son  èinvocation.
  Ce n'est gu}re pratique.

LIMIT n
=======

Pas de telle direction pour l'instant, la solution du pauvre :

Ajouter en fin de code :


  SKIP &A000-$  ; To protect overlapping at &A000


Explication:
  Si $ est sup{rieur @ &A000, la valeur est n{gative, provoquant une  èerreur.

BANK n  (Attention Buggu{ pour &C1 et &C3 !)
=============================================

La directive BANK n reconfigure la m{moire tel que le ferait un ''OUT  è&7fff,n''.
Ainsi,

   BANK #C4
   ORG #3F00
   [...]  ; #200 octets de code savoureux

installera le code @ cheval sur la RAM et sur "#C4".

Tandis que

   BANK #C2
   ORG #3F00
   [...]

installera le code @ cheval sur les banks #C4 et #C5.

 Bugs connu !
-------------

 - Les connections #C1 et #C3 sont mal g{r{es.
 - La sauvegarde binaire enregistre ce qu'il y a en bank &C0 (bug #DA).

BYTE et WORD
============

La commande BYTE accepte chaines et octets, possiblement mix{s :

    ''BYTE  12,"ABC",-1   Encode #0c #41 #42 #43 #ff''

Un "BYTE" ou "WORD" sans param}tre incr{mente les pointeurs ($ et $$) sans  è{crire en m{moire.
Trois raisons possibles :
 - R{utiliser la valeur courante en m{moire (eg : param}tre que l'on  èsouhaite conserver d'une ex{cution @ l'autre, meme en r{-assemblant le  ècode entre temps).
 - A but de documentation, signaler que la valeur n'a pas besoin d'etre  èinitialis{e par l'assembleur (eg : variables de toute fa\on initialis{es  èau run-time).
 - D{finir facilement des positions dans une structure. Eg :



         ld a,(ix+pat_flags)    Donne ld a,(ix+2)
         ld e,(ix+pat_value)    Donne ld e,(ix+3)
         ld d,(ix+pat_value+1)  Donne ld d,(ix+4)

          ORG 0
pat_pos   WORD       N'{crit rien @ l'adresse 0 !
pat_flags BYTE
pat_value WORD


STR
===

Pas de telle directive comme sous MaxaM, {mul{e par :


     BYTE "Piou!" OR &80


N'importe quelle op{ration logique ou arithm{tique est utilisable, elle  èsera appliqu{e au dernier octet de la chaine.

SKIP n
======

Equivalent @ ''n ** BYTE''.
C'est @ dire que $ et $$ sont incr{ment{s de n, sans {criture m{moire.

RESTORE
=======

R{tablit le syst}me, la pile, le niveau d'huile avant de revenir @  èl'{diteur.
Nul besoin de sauvegarder AF' et BC', le vecteur d'interruption en #38,  èetc...
Cette derni}re remarque est aussi valable pour un simple RET, pour peu que  èla pile soit valide.

IF ELSE END
===========

Assemblage conditionnel:

IF predicate
   [...]  // Assembl{ si pr{dicat diff{rent de 0
END

; Autre exemple
IF toto-4
   [...]  // Assembl{ si toto != 4
END


La clause ELSE est facultative.
Orgams permet 8 niveaux de IF ELSE END. A consommer sans mod{ration, avec  èmod{ration.

MACRO
=====

La d{finition doit pr{c{der l'usage.

 D{finition d'une macro
------------------------


MACRO macro_name [param1[,param2[,...]]]
...
ENDM



Copi{ du manuel de Rasm:
Une macro est une fa\on d'{tendre le langage, en d{finissant un bloc  èd'instructions, d{limit{ par MACRO
et ENDM, et qui pourra etre ins{r{ ult{rieurement dans le code, par simple  èutilisation du nom
de la macro. Les macros peuvent prendre des param}tres, il est ainsi  èpossible de faire de l'assemblage
conditionnel avec les macros : @ chaque appel de macro, le code dâ™origine  èest ins{r{, avec substitution
des param}tres.

Exemple classique :


MACRO SET_CRTC reg, val
     ld bc,&bc00+reg:out (c),c
     ld bc,&bd00+val:out (c),c
  ENDM


 Utilisation d'une macro
---------------------------

Reprenant l'exemple pr{c{dent:

     SET_CTRC 1,48


Attention ! Orgasm pense que vous voulez d{clarer un label si vous tentez  èd'invoquer une macro sans param}tre.
Pour palier @ ce d{faut, ajoutez une paire de parenth}se "()".


MACRO DBG_MARKER
  IF debug
    push af
    push bc
    ld bc,&7f10:out (c),c
    ld a,r:and &1f:or &40:out (c),a
    pop bc
    pop af
  END
ENDD
...
    DBG_MARKER () ; explicit invocation of macro


 Appel de macro avec param}tres dynamiques
--------------------------------------------

Les param}tres pass{s lors de l'appel d'une macro ne sont pas  èn{cessairement des constantes, ils peuvent etre des expressions :


MACRO RWORD w
  ; Reversed word (Big endian).
  BYTE w/&100, w and &ff
MEND

   3 ** RWORD #+2  ; Produce 00,02,00,03,00,04


 Limitations
------------

En l'absence de labels locaux ou auto-num{rot{s, d{clarer un label dans  èune MACRO aboutit @ une erreur d'assemblage (multiple d{finition).
Cela restreint passablement l'utilit{ des MACROs, et sera combl{ dans une  èprochaine version d'Orgams.


Labels
######

 - Sensibles @ la casse
 - Pas de limitation dans la taille (le nom des labels n'{tant stock{  èqu'une fois, ne pas h{siter @ en choisir des longs)
 - Commence par une lettre, suivi de lettres, chiffres, ou un des  ècaract}res suivant "_#'"

Expressions num{riques
#######################

Vrai gestion du signe
=====================

Un ''step = -1'' n'encode pas &ff ou encore &ffff, mais bel et bien -1.  èAinsi, ''LD A,step*step'' passe sans soucis.
Par cons{quent, une erreur concernant un d{passement de capacit{ indique  èun vrai probl}me dans votre programme.

Arithm{tique {tendue
======================

Les labels peuvent prendre des valeurs sign{es 24 bits. Autorise par  èexemple :

ram = &40000 ; yes, 256k

chunksNb = 16 ;
chunkSize = ram/chunksNb ;


Les expressions et r{sultats temporaires peuvent atteindre 1024 bits.

   ld a,ram*ram/#100000000 ;ok, \a vaut 16


Expressions
===========

 - Pas de priorit{ des op{rateurs

Le s{quen\age se fait uniquement par espaces et crochets.
 - Exemples :

     LD   a,1+2*3  ; 9  (+ et * effectu{s dans l'ordre)
     LD   a,1+2 *3 ; 9
     LD   a,1+ 2*3 ; 7  (2*3 forme un groupe isol{, calcul{ @ part avant  èd'ajouter 1)
     LD   a,1+[2*3] ; 7 Idem, de mani}re plus classique.

 - R}gle simple. Rien @ retenir. Visuellement coh{rent.

Op{rateurs logiques et modulo en toutes lettres (and, xor, or, mod)
====================================================================

 Facile @ retenir.

R{p{tition
############

Une instruction ou un bloc peuvent se voir r{p{t{s. Les avantages sont  è{vidents :
 - Plus compact (@ lire, @ {crire, @ stocker)
 - Le nombre de r{p{titions devient controlable par un label.
 - "defs" sous st{roide :

     16** byte 1,2,3  ; 1,2,3,1,2,3,1,2,3...


Pour une r{p{tition de bloc, le '[' doit se trouver sur la meme ligne :


;good
   nblines ** [
       INC b:OUTI
       INC b:OUTI
       EXX
       OUT (c),e:OUT (c),d:OUT (c),0
       EXX
       ]
;bad
   nblines **
     [
     INC b:OUTI
     INC b:OUTI
     EXX
     OUT (c),e:OUT (c),d:OUT (c),0
     EXX
     ]


Bien sur, tout label @ l'int{rieur d'un bloc r{p{t{ plus d'une fois l}vera  èune erreur (double d{finition).

Les expressions sont r{-{valu{es @ chaque it{ration. Cela facilite la  ècr{ation de tables :



             ORG #9000
rampe3   256** BYTE ($*3) and #ff    ; stocke 00 03 06 09 ... FF 02 05 08  è...



Warning !

     4**LD A,(DE):INC E   ; buggy. Only 1 INC E
     4**[LD A,(DE):INC E] ; ok.


On autorise jusqu'@ 8 niveaux d'imbrication. Au-del@, demander d{rogation  è@ la clinique la plus proche.

Pseudo labels #, ##, ###
========================

Le pseudo label # vaut l'index de l'it{ration contenante (on compte @  èpartir de 0).
Le pseudo label ## vaut l'index de l'it{ration au niveau imm{diatement  èsup{rieur (quand plusieurs r{p{titions imbriqu{es, bien sur).
Etc.



 2 ** [
 3 ** BYTE &10*## + #  ; stocke 00 01 02 10 11 12
      ]



S{parateur ":"
###############

 - Permet de regrouper des instructions qui forment une op{ration logique,  èet de mieux figurer les similitudes. Eg :

        LD  hl,awesomeness:inc (hl)
        LD  hl,brightness :inc (hl)
        LD  hl,ovlness    :inc (hl)

 - Moins de ligne = meilleure vue d'ensemble sur une routine.
 - Essentiel pour pseudo-labels @ venir.

::::::::::::::
: Assemblage :
::::::::::::::

La recette suivante est appliqu{e :

 - Restore firmware (00-3F et HIMEM-BFFF)
 - Restore breakpoints (30-32 et BE00-BE??) (actually these two steps are  èdone under the hood when returning to Orgams, leading to bug #e2)
 - Assemble
 - Restore firmware's SP (BFD0 et des brouettes)
 - Push housekeeping routine on the stack
 - Connection C0, d{sactive ROMs basse et haute, DI
 - Saute @ l'adresse d'ex{cution (CONTROL-2).

::::::::::::
: Monogams :
::::::::::::

N'h{sitez pas @ utiliser les fl}ches pour naviguer dans l'historique.
Quelques commandes notables :

m[nn]
#####

Dump m{moire @ partir de nn. Si rien n'est sp{cifi{, utilise la pr{c{dente  èadresse.
Les octets sont affich{es en hexa, ASCII et graphiquement. Pratique pour  èv{rifier une courbe ou d{tecter des anomalies.
Les zones @ 0 sont saut{es. Merci qui ?

xnn,nn2
#######

Compare deux zones m{moires. Seules les diff{rences sont affich{es.
Ainsi, pour comparer par exemple les banks &c6 et &c7:


b&c2
x&8000,&c000


hnn,size
########

Injecte 'size' octets @ partir de 'nn' dans le source sous forme de BYTE.

gr
##

Dump graphique de la m{moire.
Attention contrairement au Hackeur, on n'obtient pas 1 octet non nul = 1  èpixel mis.
Les octets sont grosso-modo OR{s par paquets de 8.

clear[n] / clr[n]
#################

Rempli les 128 premier ko avec n ou 0, ind{pendamment de la connexion  ècourante.

clearpage[n] / clp[n]
#####################

Rempli la page connect{e (64 ko) avec n ou 0.

::::::::::::::::::::
: Points d'arret. :
::::::::::::::::::::

Quand Orgams est invoqu{ puis @ chaque assemblage, une routine de point  èd'arret est install{e en &BE00, et un saut vers cette routine en &30.

Appel
#####

Ainsi un RST 6 bascule en mode trace. Du reste, la pseudo instruction BRK  è(CTRL+SPACE) dans un source {met simplement un RST 6.
L'appel en #BE00 facilite les arrets conditionnels. Eg :


break = &BE00
    LD a,(pattern_pos)  ;Must be non-zero
    OR a
    CALL z,break  ;Investigate !


Tous les registres au moment de l'arret sont pr{serv{s. La seule  èmanipulation destructive est l'{criture de 2 mots dans la pile :
 - L'adresse de retour plac{e par le RST (ou le CALL #BE00), n{cessaire  èpour connaitre le PC courant.
 - Un PUSH AF n{cessaire pour sonder IFF ({tat EI/DI).

Orgams tente de d{tecter la connexion bank (MMR) au moment du BRK. La  èm{thode est heuristique et faillible.
La connexion ROM (RMR) n'est pas d{tect{e. C'est un bug.

Limitations
===========

 - Dans une utilisation classique, l'{criture dans la pile (voir ci- èdessus) ne perturbe en rien le retour dans le programme (@ l'instar d'une  èinterruption). Mais si SP pointait sur une table, il faudra tenir compte  ède la corruption des 4 oc
tets.
 - Il faudra veiller vous-meme @ la connexion RAM avant d'utiliser BRK !
Exemple de pi}ge :


   LD  BC,#7fC2
   OUT  (C),C
   [...]
   BRK     ; Plantage !! Saute en #30 dans la mauvaise banque.


:::::::::::::::::::::::::::::
: D{buggueur/D{sassembleur. :
:::::::::::::::::::::::::::::

On distingue deux types de navigations, avec ou sans ex{cution. Du reste,  èla commande 'd' du moniteur peut se comprendre (D)ebug ou (D){sassemble.

Sans ex{cution, il s'agit d'un d{sassemblage classique, mais avec toute la  èsouplesse Orgams (embrasse tes genoux) :
 - scrolling haut et bas  (rapide avec CONTROL)
 - CONTROL-ENTER et RETURN @ l'instar de l'{diteur pour explorer des  èsous-routines (et en revenir !) sans avoir @ saisir une seule adresse.

Avec ex{cution, on retrouve tout la puissance d'un d{buggueur pas @ pas :
 - (S)tep ex{cute une instruction. S'il s'agit d'un appel, on entre dans  èla sous-routine.
 - (N)ext ex{cute en mode rapide
 - Parfois, on ne veut ni tracer ni meme ex{cuter une routine (e.g.  è#BB06). Dans ce cas, il suffit de placer le pointeur @ l'instruction  èsuivante, et de ses doigts activer CONTROL-G. Cela replace PC ($) sans  èrien ex{cuter.
 - Pour ne pas avoir @ suivre laborieusement les N it{rations d'une  èboucle, on placera le curseur de fa\on ad{quate, puis on appuiera sur T ou  èESPACE : la boucle sera bien ex{cut{e, mais en mode rapide.


Limitations {mulation :
#######################

 - Les bit 3 & 5 du registre F ne sont pas correctement reproduits.
 - Les interruptions ne sont pas {mul{es.


Visualisation Source/M{moire :
##############################

Orgams teche de retrouver la ligne du source correspondant @ l'opcode sous  èle curseur '>'. Il peut {chouer, @ tord ou @ raison, affichant alors  è"source not found". Cette fonctionnalit{ ralentit la trace pas @ pas,  èsurtout en cas d'{chec.

Une l{g}re pression sur CONTROL-V permet de basculer vers un dump m{moire,  è@ la derni}re adresse s{lectionn{e par la commande 'M' du moniteur. Ce  èmode l@ ne p{nalise pas la trace en vitesse.

Retour au source
################

CONTROL-ESC retourne @ l'{diteur @ la ligne en cours de visualisation,  ècontrairement @ ESC-ESC qui ne touche pas au curseur d'{dition.

Retour au programme.
####################

Le retour se fait par J (comme JUMP). L'{tat du Z80 est restaur{ : du  èpoint de vue des registres tout se passe comme si on avait appel{ la  èroutine ''PUSH AF:POP AF:RET''. Bien sur si le programme a {t{ trac{ pas @  èpas, on reprend avec les
 valeurs courantes de registres.
Les registres CTRC sont r{tablis avec les d{fauts syst}me.

Possible {chec
===============

Le retour peut {chouer dans les cas suivants :
 - Il y avait du code en page C000 ({cras{ par l'affichage de la trace).
 - SP pointait sur une table.
 - La connexion ROM/RAM est erron{e.

 avait du code en page C000 ({cras{ par l'affichage de la trace).
 - SP pointait sur une table.
 - La connexion ROM/RAM est erron{e.