Processeur Hitachi HD63C09EP

Placez ici vos trucs et astuces, étalez sans retenue votre savoir-faire et votre science qui va nous permettre de redonner une apparence neuve et fonctionnelle à nos bouzes.

Modérateurs : Papy.G, fneck, Carl

Daniel
Messages : 17424
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Processeur Hitachi HD63C09EP

Message par Daniel »

J'ai reprogrammé la lecture d'un octet sur carte SD en utilisant les registres E et F du 6309. Voici le résultat :
Programme initial pour processeur 6809 : 175 cycles
Programme modifié pour processeur 6309 en mode émulation : 167 cycles (gain 4,5%)
Programme modifié pour processeur 6309 en mode natif : 134 cycles (gain 23,5%)
On peut peut-être faire mieux en utilisant d'autres fonctions cachées du 6309.

Code : Tout sélectionner

Lecture d'un octet pour processeur 6809 : 21x8 + 7 = 175 cycles 
---------------------------------------------------------------
RBYTE
  LDA   #$FE          b0 marqueur fin de boucle (2)
RBYTE1      
  LDB   #$7F          Valeur pour test bit 7    (2)
  STB   <$CC          clock high, di high       (4)
  CMPB  <$CC          PA b7 (bit lu) -> carry   (4)
  LDB   #$5F          clear bit 5               (2)
  STB   <$CC          clock low, di high        (4)
  ROLA                C (bit lu) -> b0 reg A    (2)
  BCS   RBYTE1        suite de la boucle        (3) 
  RTS                 retour (octet dans A)     (5)

Code : Tout sélectionner

Lecture d'un octet pour processeur 6309. Registre W prealablement initialise : $7F5F
20x8 + 7 = 167 cycles en mode emulation ()    16x8 + 6 = 134 cycles en mode natif []
------------------------------------------------------------------------------------
RBYTE
  LDA   #$FE          b0 marqueur fin de boucle (2) [2] 
RBYTE1      
  STE   <$CC          clock high, di high       (5) [4]
  CMPE  <$CC          PA b7 (bit lu) -> carry   (5) [4]
  STF   <$CC          clock low, di high        (5) [4]
  ROLA                C (bit lu) -> b0 reg A    (2) [1]
  BCS   RBYTE1        suite de la boucle        (3) [3] 
  RTS                 retour (octet dans A)     (5) [4]
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7988
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Processeur Hitachi HD63C09EP

Message par __sam__ »

Daniel, vu que tu as libéré B, tu peux l'utiliser au lieu de E et gagner 2 cycle. En effet STB (resp. CMPB) prend 1 cycle de moins que STE (resp. CMPE).

Autre optim: dérouler la boucle et utiliser LDBT (LoaDBiT) qui permet de charger un bit de A (ou B et même CC) depuis un autre bit en mémoire (direct page). On réalise alors l'équivalent du CMP+ROR avec une seule instruction:

Code : Tout sélectionner

STB   <$CC                                  (4) [3]
LDBT A,7,7,$CC   A[7] = mem({DP,$CC})[7]    (7) [6]
STF  <$CC                                   (5) [4]
STB  <$CC                                   (4) [3]
LDBT A,7,6,$CC   A[6] = mem({DP,$CC})[7]    (7) [6]
STF  <$CC                                   (5) [4]
STB  <$CC                                   (4) [3]
LDBT A,7,5,$CC   A[5] = mem({DP,$CC})[7]    (7) [6]
...
STF  <$CC                                   (5) [4]
STB  <$CC                                   (4) [3]
LDBT A,7,1,$CC   A[1] = mem({DP,$CC})[7]    (7) [6]
STF  <$CC                                   (5) [4]
STB  <$CC                                   (4) [3]
LDBT A,7,0,$CC   A[0] = mem({DP,$CC})[7]    (7) [6]
STF  <$CC                                   (5) [4]
Si je ne me trompe pas, on a 8 fois ( STB + STF + LDBT) = 8 * (4 + 5 + 7) = 128 cycles en mode compatible et 104 en mode natif!

J'ai essayé d'utiliser le TFM pour remplacer le couple STF/STB par une seule instruction, mais ca me semble moins bon.
Dernière modification par __sam__ le 23 avr. 2014 18:42, modifié 1 fois.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
__sam__
Messages : 7988
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Processeur Hitachi HD63C09EP

Message par __sam__ »

Hum en fait si on garde CMPB + ROLA c'est mieux 8*(4 + 5 + 4 + 2) = 120 cycles en émulation et 88 en mode natif.

Zut, je m'étais fait une fausse joie d'utiliser LDBT.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17424
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Processeur Hitachi HD63C09EP

Message par Daniel »

Si mes souvenirs sont exacts, dans mes démos de musique avec une carte SD, la boucle est déroulée et il faut 145 cycles. Avec 88 cycles, la fréquence d'échantillonnage peut passer de 5600 Hz à 9200 Hz, l'amélioration doit être perceptible à l'oreille.

J'ai essayé de passer le 6803 en mode natif avec un LDMD #$01, ça semble bien marcher, par contre il faut désactiver les interruptions pour ne pas planter le système. Il n'est pas possible, dans ce mode, de faire tourner le moniteur et le Basic du MO5 sans modification.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7988
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Processeur Hitachi HD63C09EP

Message par __sam__ »

Daniel a écrit :J'ai essayé de passer le 6803 en mode natif avec un LDMD #$01, ça semble bien marcher, par contre il faut désactiver les interruptions pour ne pas planter le système. Il n'est pas possible, dans ce mode, de faire tourner le moniteur et le Basic du MO5 sans modification.
C'est ce que je craignais :( Il faut un "OS" maison. Probablement que l'OS9 de fool ferait un excellent candidat :!:

Cela dit, dans les routines qui lisent un bloc de données on peut temporairement désactiver les interruptions et passer en mode natif le temps de récupérer le bloc.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17424
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Processeur Hitachi HD63C09EP

Message par Daniel »

Oui, tout à fait, c'est ce que je fais pour tester le mode natif :
1) sauvegarder tous les registres du 6809
2) désactiver les interruptions avec ORCC
3) passer en mode natif avec LDMD
4) exécuter un programme en mode natif
5) revenir en mode émulation
6) restaurer tous les registres du 6809
7) revenir au Basic

Reste à voir si une modification simple de la rom du MO5 permettrait d'utiliser le mode natif. Il suffit peut-être de changer quelques instructions dans le traitement des interruptions. J'ai remplacé la ROM de mon MO5 par une EPROM sur support, je peux donc facilement tester d'autres versions du moniteur et/ou du Basic. J'ai aussi une EPROM en $B000-$C000 qui me donne de la place pour écrire des routines supplémentaires. Par exemple je peux changer les adresses de traitement des interruptions pour pointer vers mes propres routines dans la plage $B000-$C000, sans modifier une seule ligne du moniteur.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7988
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Processeur Hitachi HD63C09EP

Message par __sam__ »

Les endroits à changer dans la rom MO5 sont peut-être ceux liés aux interruptions, et plus particulièrement ceux qui lisent les registres sauvegardés sur la pile lors des interruptions je pense. Il n'y a peut-être pas tellement d'endroits, mais l'un des soucis est que l'appel en ROM est lui même une interruption.

Je ne sais pas si comme pour le TO8 la rom MO5 a été entièrement desassemblée et commentée, mais cela aiderait à savoir ce qu'il faudrait changer.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17424
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Processeur Hitachi HD63C09EP

Message par Daniel »

Vecteurs en ROM MO5
--------------------------
FFF0 0000 Reserved
FFF2 F0AD Software Interrupt 3 (SWI3)
FFF4 F0AD Software Interrupt 2 (SWI2)
FFF6 F642 Fast Interrupt Request (FIRQ)
FFF8 F657 Interrupt Request (IRQ)
FFFA F63E Software interrupt (SWI)
FFFC F0AD Non-Maskable Interrupt (NMI)
FFFE F003 Reset

Vecteurs en RAM après l'initialisation
-------------------------------------------
2067: F0AD
205E: F07B
2061: F0AD
2064: F0AD

Extrait du moniteur MO5 version 1.1
-------------------------------------------

Code : Tout sélectionner

----------------------------------
Traitement interruptions SWI
----------------------------------
F07B  A6E4      LDA    ,S       
F07D  84F0      ANDA   #$F0
F07F  A7E4      STA    ,S
F081  1F8A      TFR    A,CC
F083  8620      LDA    #$20
F085  1F8B      TFR    A,DP
F087  E6F80A    LDB    [$0A,S]
F08A  C47F      ANDB   #$7F
F08C  9E6A      LDX    /$6A
F08E  EC85      LDD    B,X
F090  8EF09D    LDX    #$F09D
F093  3416      PSHS   X,B,A
F095  CEA7C0    LDU    #$A7C0
F098  EC65      LDD    $05,S
F09A  AE68      LDX    $08,S
F09C  39        RTS    

----------------------------------

----------------------------------
F09D  1FA8      TFR    CC,A
F09F  848F      ANDA   #$8F
F0A1  AAE4      ORA    ,S
F0A3  A7E4      STA    ,S
F0A5  AE6A      LDX    $0A,S
F0A7  E680      LDB    ,X+
F0A9  2B03      BMI    $F0AE -------------
F0AB  AF6A      STX    $0A,S              |
                                          |
----------------------------------        |
Non-Maskable Interrupt (NMI)              |
----------------------------------        |
F0AD  3B        RTI                       |
                                          | 
----------------------------------        |
                                          |
----------------------------------        |
F0AE  357F      PULS   CC,A,B,DP,X,Y,U <--
F0B0  3262      LEAS   $02,S
F0B2  39        RTS    
           
------------------------------------
Software interrupt (SWI)
------------------------------------
F63E  6E9F205E  JMP    [$205E]

------------------------------------
Fast Interrupt Request (FIRQ)
------------------------------------
F642  6E9F2067  JMP    [$2067]

------------------------------------
FIRQ crayon optique
------------------------------------
F646  108C20E4  CMPY   #$20E4
F64A  2408      BHS    $F654 -  buffer plein
F64C  DCE4      LDD    /$E4   | compteurs $A7E4-$A7E5
F64E  EDA1      STD    ,Y++   | stockes dans buffer crayon optique
F650  96E6      LDA    /$E6   | $A7E6 
F652  A7A0      STA    ,Y+    | stocke a la suite
F654  A6C4      LDA    ,U <---
F656  3B        RTI    

------------------------------------
Interrupt Request (IRQ)
------------------------------------
F657  C620      LDB    #$20
F659  1F9B      TFR    B,DP
F65B  CEA7C0    LDU    #$A7C0       adresse PIA systeme 
F65E  D619      LDB    /$19         status
F660  A643      LDA    $03,U
F662  2B04      BMI    $F668 ---    interruption fin de balayage ecran
F664  6E9F2064  JMP    [$2064]  |   routine utilisateur
F668  0C31      INC    /$31 <---
F66A  9631      LDA    /$31         compteur d'interruptions
F66C  8403      ANDA   #$03         4 interruptions = 80 ms
F66E  2621      BNE    $F691 -----  
F670  C504      BITB   #$04       | bit 2 = 
F672  270D      BEQ    $F681 --   |
F674  A6C4      LDA    ,U      |  |
F676  3402      PSHS   A       |  |
F678  3F06      SWI    #$06    |  |
F67A  BDF8B9    JSR    $F8B9   |  | clignotement curseur
F67D  3502      PULS   A       |  |
F67F  A7C4      STA    ,U      |  |
F681  0D37      TST    /$37 <--   |
F683  270C      BEQ    $F691 ---->|
F685  9638      LDA    /$38       | compteur repetition clavier 
F687  9176      CMPA   /$76       | delai repetition clavier
F689  2702      BEQ    $F68D --   |
F68B  0C38      INC    /$38    |  |
F68D  C4FD      ANDB   #$FD <--   |
F68F  D719      STB    /$19       | status
F691  A641      LDA    $01,U <----
F693  0D63      TST    /$63
F695  27BF      BEQ    $F656 --> RTI
F697  6E9F2061  JMP    [$2061]      routine utilisateur
Daniel
L'obstacle augmente mon ardeur.
Fool-DupleX
Messages : 2367
Inscription : 06 avr. 2009 12:07

Re: Processeur Hitachi HD63C09EP

Message par Fool-DupleX »

Pour le MO5, il y a mieux que le désassemblage de la ROM, il y a le code source ... j'en possède un exemplaire et ca fait des années que je veux le scanner, mais il s'agit d'un gros classeur a spirale fermée, qui n'est pas au format A4 et dont les pages ne sont pas numerotees ... Ce sujet de discussion serait peut-être l'occasion pour moi de me décider ...

Les appels au moniteur sur MO5 se font a travers SWI1. SWI1 set les flags I et F, puis empile l'intégralité des registres dans l'ordre desormais connu PC, U, Y, X, DP, B, A, CC. Vice-versa au RTI bien sur.

Evidemment, en mode natif sur le 6309, l'empilement est un peu different : PC, U, Y, X, DP, F, E, B, A, CC. F et E apparaissent au milieu et décalent A et B qui sont souvent utilisés comme paramètre sur MO5. Par exemple pour afficher un caractère, fonction $02 du moniteur, il faut mettre le caractère dans B. Voila tout l'enjeu.

Même problème avec IRQ (utilisé notamment pour le clignotement du curseur) et [EDIT] MAIS PAS FIRQ (uniquement - officiellement - utilisée par le crayon optique).

Je pense qu'il devrait être assez facile de modifier le moniteur pour pointer deux octets plus bas lors de chaque operation de pile dans l'interruption.

Au-dela de ca, il y a peut-être d'autres soucis liés au timing des instructions ...

Edit: je tapais mon commentaire en même temps que Daniel le sien. Le [$0A,S] est typiquement ce qui coince : cette instruction permet de recuperer le numero de fonction moniteur qui est stocké dans l'octet qui suit le SWI, [$0A,S] etant la valeur du PC avant interruption. un [$0C,S] devrait déjà passablement debloquer la situation ...

Edit 2: d'après le code de l'IRQ fourni par Daniel, il n'y a pas de probleme en soit avec l'IRQ, sauf qu'il y a un appel à la fonction $06 du moniteur a travers SWI pour changer la page video. Et puis il y a toute la partie utilisateur de l'IRQ sur laquelle nous n'avons pas d'emprise cote moniteur.
__sam__
Messages : 7988
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Processeur Hitachi HD63C09EP

Message par __sam__ »

Fool-DupleX a écrit :Edit: je tapais mon commentaire en même temps que Daniel le sien. Le [$0A,S] est typiquement ce qui coince : cette instruction permet de recuperer le numero de fonction moniteur qui est stocké dans l'octet qui suit le SWI, [$0A,S] etant la valeur du PC avant interruption. un [$0C,S] devrait déjà passablement debloquer la situation ...
Il faut aussi s'occuper du

Code : Tout sélectionner

F09A  AE68      LDX    $08,S
qui met dans X la valeur pushée par le SWI et qui a été trashée par les instruction du dessus. Il faudrait faire $0A,S là aussi.
La partie

Code : Tout sélectionner

F0A5  AE6A      LDX    $0A,S
F0A7  E680      LDB    ,X+
F0A9  2B03      BMI    $F0AE ------------->
F0AB  AF6A      STX    $0A,S 
est aussi à modifier car elle récupère l'adresse de retour, qui est décalée de 2 octets si on est en mode 6309 ==> donc $0C,S partout là dedans.

Allez un (mauvais) rébus qui colle bien au topic: JE => je SWI
.
.
.
.
.
.
(je penche, donc je swi :mrgreen: )
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Fool-DupleX
Messages : 2367
Inscription : 06 avr. 2009 12:07

Re: Processeur Hitachi HD63C09EP

Message par Fool-DupleX »

En définitive, le plus dur ne va pas être de patcher le moniteur, mais de trouver les quelques octets necessaires pour detecter le 6309 et basculer en mode natif des le boot ... :D

Ce serait une bonne idée de mettre une copie de ceci sur dcmoto :

http://cyberabi.ipower.com/Downloads/The_6309_Book.pdf
__sam__
Messages : 7988
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Processeur Hitachi HD63C09EP

Message par __sam__ »

Fool-DupleX a écrit :En définitive, le plus dur ne va pas être de patcher le moniteur, mais de trouver les quelques octets necessaires pour detecter le 6309 et basculer en mode natif des le boot ... :D
En fait c'est pas si difficile que ca de décider si on est sur 6309 ou sur 6809:

Code : Tout sélectionner

PSHS B
CLRB
EXG B,F   ; B=$FF si 6809, B=F sinon
EXG B,F   ; B=$FF si 6809, B=0 sinon
TSTB
PULS B    ; Z=1 si 6309, 0 si 6809 
Dernière modification par __sam__ le 24 avr. 2014 19:28, modifié 1 fois.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17424
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Processeur Hitachi HD63C09EP

Message par Daniel »

Le livre sur le 6309 est en ligne sur le site dcmoto (Documentation technique).

Image

Ah, si on pouvait avoir les sources de la ROM du MO5 au format texte pour pouvoir les recompiler, ce serait le bonheur :D

En attendant, pour essayer de faire fonctionner le 6309 en mode natif, je propose ceci :
- Modifier uniquement les adresses $FFF0-$FFFF de la ROM, si possible une seule fois (ne pas les changer à chaque nouvelle version).
- Ecrire toutes les nouvelles routines en $B000-$BFFF. Il y a de la place, on peut recopier tout le traitement des interruptions pour le modifier, sans toucher aux routines originales. Il faudrait aussi programmer le traitement des erreurs (instruction invalide ou division par zéro), et bien sûr la procédure de hardreset, qui devra activer le mode natif du processeur 6309. Comme il y a de la place, on ne s'embêtera pas à trouver quelques octets disponibles.

L'inconvénient de mon système est de ne pas être compatible avec les cartouches MEMO5 et l'extension mémoire 64K, mais il est pratique pour les tests :
- Modification une fois pour toute la ROM d'origine
- Programmation de l'EPROM $B000-$BFFF à chaque nouvelle version

Après, si le système fonctionne, il sera toujours temps de recompiler le moniteur en $F000-$FFFF.
Daniel
L'obstacle augmente mon ardeur.
Répondre