| 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,palff+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. |