RoutinesDesassembleur

org_disassemble

Adresse : TBA

In :

  • HL = adr to disassemble
  • DE = buffer for text

Out :

  • HL = next adr
  • DE = point end of text (0)
  • A, BC, IX, IY modified.

Note : En soustrayant l'adresse d'origine à l'adresse retournée, on obtient le nombre d'octets lus.

Routine témoin :

     PUSH HL
     LD HL,tNOP
     LD BC,4
     LDIR
     DEC DE
     POP HL
     INC HL
     RET
tNOP defm NOP
     defb 0

Comme ça pour tes tests tu auras l'impression de désassembler une démo de Chany.

get_pc_backward

Remonte 'PC' de n opcodes. Permet de désassembler un peu avant l'adresse courante, sans problème de décalage opcode.
Exemple :

Si en #2010 on a 00 01 01 01 01 02 03,
alors get_pc_backward(#2014, 1) renverra #2011,
de sorte à obtenir le désassemblage :
2011  ld  bc,#101     01 01 01  **1 ligne de contexte demandée**
2014  ld  bc,#302     01 02 03  **on retombe bien sur 2014, chapeau**

In

  • HL = current 'PC' address
  • B = nb opcodes to rewind (from 0 to 63)

Out

  • HL = address b opcodes backward.
  • B preserved
  • A, C, DE, IX, IY corrupted

Implémentation témoin (ne marche que pour opcodes de taille 1)

;hl = hl - b
    ld  a,l
    sub b
    ld  l,a
    ret nc
    dec h
    ret

org_get_source_line_number

Adresse : TBA

Donne la ligne du source ce correspondant à l'adresse tracée.
Permet d'afficher le source en regard du désassemblage brut.

In :

  • HL = adr tracée (PC)

Out :

  • DE = ligne dans source. 0 si aucune correspondance trouvée.
  • A, BC, HL, IX, IY modified.

Routine témoin :

; quasi cohérent avec routine dummy org_get_line
; renvoie 0 pour adresse inférieure à #100
     LD  DE,0
     INC H
     DEC H
     RET Z
     LD  A,L
     AND #1f
     SRL A
     INC A
     LD  E,A
     RET

org_get_line

Adresse : TBA

Ecrit ligne source sous forme ASCII.
(attention code spécial pour tabulation)

In :

  • DE = ligne source
  • HL = buffer texte

Out :

  • HL = fin ligne dans buffer texte.
  • A, BC, DE, IX, IY modified.

Routine témoin :

     LD  A,E
     EX  DE,HL
     LD  HL,dummy
     LD  BC,dummy_
     LDIR
     EX  DE,HL
     AND #1F
     ADD A,#61
     LD  (HL),A   ;Varie commentaire selon ligne !
     INC HL
     LD  (HL),C
     RET
dummy
     defb 8    ;Tab
     defm "NOP:NOP  ; Note "
dummy_ equ $-dummy

routines utilitaires

context_ldir

Copie données dans buffer de travail, en tenant compte de la connexion des banks/rom.

Par exemple, si le moniteur affiche C2 LROM, alors context_ldir(hl=3FF8, de=5000, bc=0010) copiera les 8 derniers octets de la rom basse puis les 8 premiers de la bank "C5".

In

  • HL = source dans connexion mémoire signalée par moniteur.
  • DE = dest dans bank travail orgams, connectée classiquement (eg : C4)
  • BC = longueur

Out (comme LDIR)

  • HL = source + longueur
  • DE = dest + longueur
  • BC = 0
  • F updated

Routine témoin (ne va pas forcément piocher au bon endroit) :

context_ldir
    LDIR
    RET

TODO : puisque cette routine doit reconnecter la bank de travail Orgasm, il faut convenir quelle banque.

  • En réalité cette banque sera mouvante (eg : C4 si 128k, D4 si 512k), il est bon de la stocker quelque part (possiblement dans la banque en question, puisqu'on la suppose connectée quand orgams s'exécute). La routine finale ressemblera donc à :
context_ldir
   push af     ; ce push là ne pose pas problème
   LD a,(orgBank) ;pour reconnection en fin de routine
   ex af,af'   ; Ou autre moyen de sauvegarder de façon sûre  (ie : PAS DE PUSH !)

   [...] ; Ici on connecte bank voulue, on copie dans tampon (#BE00)

   ex af,af'
   ld b,#7f
   out (c),a

   ex af,af'
   ld b,a
   pop af

   LDIR ; Copie de tampon vers destination finale.
   ret

Il faut donc en fait convenir de l'adresse orgBank (tout comme des autres adresses : bufRegs, pile…).

Sauf mention contraire, le contenu de cette page est protégé par la licence Creative Commons Attribution-ShareAlike 3.0 License