Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
adnz
Messages : 212
Inscription : 10 janv. 2010 00:07

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par adnz »

Dans mon code j'ai mis ça :

Code : Tout sélectionner

LDS #$9fff ; potition of S stack
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par __sam__ »

Très bien si c’est fait très tôt. Note: il faut pointer sur debutpile+1, donc #$a000 serait parfait.

Reste â voir si le bootloader reloge lui aussi la pile.
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 : 17286
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par Daniel »

J'ai analysé un peu plus le bootloader. Il provoque deux problèmes avec la dernière version de SDDRIVE.

1) La pile système écrase des zones de travail de SDDRIVE en $608E-$6099
J'ai facilement résolu le problème en déplaçant la pile système en $9FFF dès la première instruction du secteur de boot.

Code : Tout sélectionner

 ORG    $6200
 LDS    #$9FFF
 LDA    #$60               
 TFR    A,DP               
 LDX    >$001E              
 STX    ,S                 
 LDX    #$6300             
 STX    <$4F               
 LDA    #$02               
 STA    <$48           
 LDB    #$02  
 STB    <$4C  
 LDA    #$04           
LECT0
 JSR    $E82A         
 BCS    LECT9 
 INC    <$4F   
 INC    <$4C    
 DECA                    
 BNE    LECT0              
 JMP    $6300              
LECT9
 RTS
pacman-2022-pile9fff_to8.zip
(142.57 Kio) Téléchargé 29 fois

2) Les routines de chargement de fichiers par l'EXTRAMON modifient l'octet $6051.
Cet octet est utilisé par SDDRIVE pour stocker l'octet de poids fort du LBA du fichier .sd
Il est souvent nul, et l'EXTRAMON fait un ASL, donc pas de dégâts dans ce cas précis.
Par contre il y aura un problème s'il y a beaucoup de fichiers .sd sur la carte et que pacman-2022 est dans les derniers.
Je ne sais pas résoudre de façon simple ce deuxième problème.
Le plus facile serait de charger les fichiers avec la méthode de __sam__ (en utilisant le minidos).

[Edit]
En essayant le jeu avec un vrai TO8D, j'ai l'impression que la manette fonctionne mal. Par moment le pacman ne répond plus aux commandes. C'est peut-être parce que je ne sais pas les utiliser car je ne suis pas du tout joueur. Il faudrait avoir la confirmation d'autres testeurs.
Toujours avec la vraie machine, quand on appuie sur C pour voir les crédits, l'écran s'affiche pendant moins d'une demi-seconde et disparaît aussitôt. Par contre, avec une autre touche, il s'affiche normalement et ne disparaît qu'avec un nouvel appui sur une touche.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
fxrobin
Messages : 102
Inscription : 07 mars 2019 13:51
Localisation : RENNES
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par fxrobin »

Okay pour la pile S, je changerai sa localisation dès le boot.

Voici mon code source qui s'execute pendant la phase de boot, c'est un "chargeur" de .BIN qui utilise effectivement l'extramoniteur.

Code : Tout sélectionner

*****************************************************************************************************************
* Routine : LOAD_CURRENT_FILE
* Affiche la progress bar, en appelant "DRAW_PROGRESS_BAR"
* Active la bank associée avec le fichier
* Lit le fichier BIN stocké dans CURRENT_FILE et stocke les différentes parties aux adresses indiquée dans le BIN
*****************************************************************************************************************
* Variables
CURRENT_SIZE FCB $00,$00 * Variable pour stocker la taille courante des données à lire (sera décrémenté)
*****************************************************************************************************************
LOAD_CURRENT_FILE 
    PSHS D,X

    BSR DRAW_PROGRESS_BAR   * on avance d'un cran en affichant la progress bar    

    * 1- Ouverture du fichier
    LDA #$00
    STA $6049       * DK.DRV $6049 <- numéro du drive
    LDA #$10
    STA $624B       * filmod $624B <- $10 (input) ou $40 (accès direct)
    EXTRA_CALL #3   * ouverture !

    * 2- Lecture du premier octet (le premier secteur du fichier) avec l'extramoniteur
    EXTRA_CALL #5   * lecture !
    
    ** Un fichier BIN a la structure suivante, on a déjà lu le premier octet 
    ** 00 [00 00] [00 00] [....data ...] [00 00] [00 00] [....data....] [00 00] [00 00]
    **    taille  offset   données       taille  offset   données       taille  (trailer, taille zéro = fini)

    * 3- Boucle de lecture d'une partie du fichier BIN  
READ_PART   
    LDA $6178       * ? EOF ?
    LBNE CLOSE_FILE
    
    ** 3a - lecture de la taille des data à charger, si la taille est égale à 0, on sort, c'est fini 
    JSR READ_BYTE       * on lit l'indicateur de taille poids fort
    LDA $6196           * on met la valeur dans A
    JSR READ_BYTE       * on lit l'indicateur de taille poids faible
    LDB $6196           * on met la valeur dans B -> D contient donc la taille des données à lire
    CMPD #$0000         *
    LBEQ CLOSE_FILE     * si la taille est égale à 0, on quitte
    STD CURRENT_SIZE    * sinon, on stocke la taille à lire dans la variable CURRENT_SIZE

    ** 3b- lecture de l'adresse d'implantation 
    JSR READ_BYTE       * on lit l'indicateur de taille poids fort
    LDA $6196           * on met la valeur dans A
    JSR READ_BYTE       * on lit l'indicateur de taille poids faible
    LDB $6196           * on met la valeur dans B -> D contient donc l'adresse d'implantation en mémoire des données
    TFR D,X             * X pointe sur l'adresse d'implantation

    ** 3c - on lit l'octet suivant avant la boucle
    JSR READ_BYTE
   
!   ** 3d - Boucle sur tous les octets des DATA de cette partie, on les stocke à l'adresse d'implantation
    LDA $6178        * ? EOF ?
    BNE >            * si pas egal à 0, on sort
    LDA $6196        * sinon on lit l'octet
    STA ,X+          * on le stocke à l'adresse souhaité et on incrémente l'adresse /!\ C'est le coeur de la copie
    JSR READ_BYTE    * on avance dans le buffer qui charge automatiquement les secteurs suivants.
    LDY CURRENT_SIZE
    LEAY -1,Y 
    STY CURRENT_SIZE
    LBEQ READ_PART   * on relance une nouvelle partie du fichier BIN (taille, adresse, data)
    BRA < 
!   * Fin de boucle

CLOSE_FILE  * 4 - fermer le fichier courant
    EXTRA_CALL #6
    PULS X,D,PC
*****************************************************************************************************************    

   
*********************************************************************************************
* Routine : READ_BYTE 
* Lecture d'un octet sur le fichier courant                                                 
*********************************************************************************************

FCBPTR EQU DOS_FCB          * pointeur vers le FCB du dernier fichier ouvert
  
READ_BYTE
    PSHS   X,B                
    LDX    #FCBPTR+$10      *   Pointeur sur le FCB courant (+$10)
    LDB    $07,X            *   Si pas de donnée à lire dans le secteur ? 
    BNE    EXIT             *   fin de la lecture
    LDB    $08,X            *   Si la fin du secteur
    DECB                    *   est atteinte,
    BEQ    READ_NEXT_SECTOR *   charge un nouveau secteur
    STB    $08,X            *   Sauve le décompteur de données
    LDB    -$0B,X           *   Récupère l'offset sur la donnée courante
    INC    -$0B,X           *   Incrémente l'offset sur la donnée courante
    ABX                     *   Calcule le pointeur sur la donnée courante
    LDB    $0B,X            *   Lit la donnée courante
    STB    $6196            *   On la met dans le registre adhoc
    PULS   B,X,PC           *   On sort (RTS)  
READ_NEXT_SECTOR 
    LDB    #$05             * Lit la donnée suivante (en chargeant le secteur suivant)
    JSR    EXTRAMONITEUR    * par l'ExtraMoniteur
    LDB    $6178            * Si pas de secteur chargé,
    BNE    EXIT             * fin de la lecture
    PULS   B,X,PC           * On sort (RTS) 
EXIT
    * NO DATA
    LDB    #$FF             * END_OF_FILE Flag
    STB    $6178            * Register for END_OF_FILE
    PULS   B,X,PC    
C'est dommage de ne pas pouvoir utiliser les routines de l'extramoniteur sans risque, je dois pas être le seul à utiliser ces routines quand même depuis le temps. Ca risque de poser de problèmes sur d'autres softs avec le "nouveau" SDDrive.
Fan d'ATARI 2600, de THOMSON MO5-TO8 et d'ATARI ST
Mes articles : https://www.fxjavadevblog.fr/retro-programming/
Membre du groupe wide-dot.
Daniel
Messages : 17286
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par Daniel »

La difficulté pour le contrôleur SDDRIVE est de trouver quelques octets libres en RAM pour stocker des variables, en particulier le LBA du fichier .sd sélectionné. Il faut que la zone soit libre quelle que soit la machine, MO ou TO. J'en ai essayé plusieurs, et j'ai changé à chaque découverte d'un programme incompatible. En fait il n'y pas de zones libres car les programmeurs de Thomson en cherchaient eux aussi et ils les ont toutes utilisées.

Par exemple, dans la documentation officielle, $6051-$6052 est la position de la tête du lecteur 0:, $6051-$6052 est la position de la tête du lecteur 1:.
SDDRIVE n'a pas besoin de stocker des positions de têtes, car la carte SD n'a aucune mécanique, j'ai donc choisi d'utiliser ces zones.

Malheureusement les ingénieurs Thomson, à la recherche de zones en mémoire, ont eu la même idée et les ont utilisées pour le DOS du Basic 512, appelé par les fonctions de chargement de fichier d'EXTRAMON. En fait c'est la première fois que je rencontre un programme utilisant l'extra moniteur pour charger des fichiers. C'est lourd et lent, les programmeurs préfèrent utiliser le minidos ou charger directement des secteurs physiques sans utiliser de structure de fichiers. Cette dernière méthode est simple et surtout extrêmement rapide. Exemple : Mission: Liftoff.

Ceci dit, dans la mesure ou le fichier .sd n'est pas stocké a une adresse trop élevée, l'octet de poids fort du LBA est à zéro et le bootloader fonctionne bien. Je l'ai essayé avec une carte microSD HC de 8Go avec le fichier en 46e position et ça marche bien. On peut donc considérer qu'en utilisation normale le bootloader est compatible avec SDDRIVE, à la condition de mettre le pointeur de pile système en $9FFF.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
adnz
Messages : 212
Inscription : 10 janv. 2010 00:07

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par adnz »

y'a pas 2 adresses de libre vers $E... quelques choses, faut que je retrouve où j'ai vu ça !!
[EDIT] ici t'utilise déjà ? E7B0-E7BF Unused (free for custom expansions)
[EDIT]: ha oui mais c'est seulement TO !..
Avatar de l’utilisateur
fxrobin
Messages : 102
Inscription : 07 mars 2019 13:51
Localisation : RENNES
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par fxrobin »

Oui je comprends.

Pour le loader de BIN, en fait, adnz ne souhaitait pas tout casser de sa façon de coder et générer le jeu, donc c'est sous forme fichiers. J'ai dû adapter le bootloader à cette contrainte.

Et je suis d'accord ça peut certainement être plus rapide, mais déjà tellement plus rapide que le loader de BIN du basic (loadm). J'essaierai de faire une version avec minidos.

On est sur d'autres projets avec Bentoc et Adnz, et là, on a plus de fichiers, que des datas. Et on ny fait plus que de la lecture de secteurs.
Fan d'ATARI 2600, de THOMSON MO5-TO8 et d'ATARI ST
Mes articles : https://www.fxjavadevblog.fr/retro-programming/
Membre du groupe wide-dot.
Avatar de l’utilisateur
adnz
Messages : 212
Inscription : 10 janv. 2010 00:07

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par adnz »

déjà si en déplacent la pile du boot ça debug le soucis, c'est nickel pour ce projet là :)

[EDIT ]du coup la version OK c'est le fichier .sd : pacman-2022-pile9fff_to8.zip. ?
Avatar de l’utilisateur
fxrobin
Messages : 102
Inscription : 07 mars 2019 13:51
Localisation : RENNES
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par fxrobin »

Sinon avec sddrive, en faire une vraie disquette avec SD2DSK qui fonctionne parfaitement aussi :mrgreen:
http://dcmoto.free.fr/programmes/sddriv ... index.html
Fan d'ATARI 2600, de THOMSON MO5-TO8 et d'ATARI ST
Mes articles : https://www.fxjavadevblog.fr/retro-programming/
Membre du groupe wide-dot.
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par __sam__ »

Juste un petit rappel. Pour démarrer la pile en $9FFF, il faut charger S avec $A000 (S commence toujours par se décrementer avant de pusher quoi que ce soit).
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
Avatar de l’utilisateur
fxrobin
Messages : 102
Inscription : 07 mars 2019 13:51
Localisation : RENNES
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par fxrobin »

Oui j'avais noté ... moi :mrgreen:
Fan d'ATARI 2600, de THOMSON MO5-TO8 et d'ATARI ST
Mes articles : https://www.fxjavadevblog.fr/retro-programming/
Membre du groupe wide-dot.
Daniel
Messages : 17286
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par Daniel »

@sam: Oui, tu as raison, en mettant $9FFF on perd un octet. Ce n'est pas dramatique, je ne fais pas une nouvelle version pour ça.

@adnz: On peut tenter de diffuser uniquement la version pacman-2022-pile9fff_to8.sd pour SDDRIVE. Elle devrait bien fonctionner, sauf cas exceptionnel de remplissage de toute la carte SD, ou carte SD simple capacité. Je pense qu'il faut quand même garder la version "AUTO.BAT" comme solution de secours en cas de problème.
Les adresses E7B0-E7BF Unused (free for custom expansions) sont disponibles pour des périphériques, mais ne contiennent pas de RAM. Elles ne conviennent pas pour stocker les variables de SDDRIVE. Et bien sûr elles ne concernent pas tous les ordinateurs Thomson.

@fxrobin: Entre la solution "minidos" et la lecture directe de secteurs physiques, il y a encore une solution intermédiaire avec un programme assembleur faisant tout le travail : lecture du catalogue, recherche dans la FAT, lecture des secteurs, détermination des adresses de chargement et des tailles des fichiers, le tout en utilisant uniquement les fonctions standard du contrôleur de disquette. Beaucoup de jeux commerciaux sont chargés de cette façon. C'est à peine plus compliqué que d'utiliser EXTRAMON, ça évite de charger le DOS en BASIC 1.0, ça fonctionne avec tous les modèles d'ordinateur et c'est nettement plus rapide.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
adnz
Messages : 212
Inscription : 10 janv. 2010 00:07

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par adnz »

merci, j'ai donc mis dans le zip le .fd, le .sd autobat et le .sd pile9fff :)
__sam__
Messages : 7909
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par __sam__ »

Daniel a écrit : 16 août 2022 20:24 @fxrobin: Entre la solution "minidos" et la lecture directe de secteurs physiques, il y a encore une solution intermédiaire avec un programme assembleur faisant tout le travail : lecture du catalogue, recherche dans la FAT, lecture des secteurs, détermination des adresses de chargement et des tailles des fichiers, le tout en utilisant uniquement les fonctions standard du contrôleur de disquette. Beaucoup de jeux commerciaux sont chargés de cette façon. C'est à peine plus compliqué que d'utiliser EXTRAMON, ça évite de charger le DOS en BASIC 1.0, ça fonctionne avec tous les modèles d'ordinateur et c'est nettement plus rapide.
Je fais cela dans certains de mes projets: le bootblock charge via les opérations sur les secteurs (bref trackload) un bootloader qui charge le fichier AUTO.BIN en lisant la FAT et le fichier via les fonctions du contrôleur. En plus, pour ceux qui ont fait de la programmation avancée, j’utilisé des continuations (cf méthode yield dans le code).
Dernière modification par __sam__ le 16 août 2022 20:51, modifié 2 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 : 17286
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Projet : 40ème anniversaire PAC-MAN TO8/TO9+

Message par Daniel »

@adnz: Pour le joueur de base, le nom pile9fff n'est pas très évocateur. On pourrait le renommer (par exemple) pacman2022-bootloader_to8.sd, et la version de secours pourrait s'appeler pacman2022-autobat_to8.sd. Ce n'est qu'une suggestion, le nom n'a pas grande importance.
L'important, ce ne sont pas ces magouilles techniques d'informaticiens pinailleurs, c'est le jeu lui-même 8)
Daniel
L'obstacle augmente mon ardeur.
Répondre