Flobynoid

Un patch pour Flobynoid!

Cet article fait suite à ma page sur la démo du jeu Flobynoid programmé par les anciens crackers/programmeurs/artistes The Gog's, Deny et Spk du groupe ACS.

Comme je le mentionnais, pour avoir une chance que le soft complet fonctionne avec l'émulateur d'Apple II Applewin, il faut avant tout s'assurer que dans la configuration, la vitesse du drive soit en mode "Authentic Speed".
Selon votre version d'Applewin, l'option de config peut ressembler à ceci:

Speed
Speed

Mais même en ayant effectué ce réglage, il se peut très bien que le jeu se plante en fonction de la version d'Applewin que vous utilisez:

Crash

S'il y a bien quelque chose que vous ne maîtrisez pas, c'est le suivi des mises à jour de cet émulateur.
Alors le plus simple pour que vous ne soyez pas tributaire des éventuels bogues des programmeurs d'Applewin, c'est de modifier directement le jeu Flobynoid afin de faire en sorte que quelque soit la version de votre émulateur, le jeu ne plante plus en corrigeant la source possible des problèmes.
C'est ce que je me propose de faire ici.
La modification en elle-même ne concerne que le boot 1, donc 1 seul secteur à changer.


Tout d'abord, j'ai recherché le disk image que j'allais utiliser.
Il y a celui de The Gog's que l'on trouve sur la page Flobynoid sur son site du Free Tools Association (FTA).
Cette version est datée de 2002 et correspond à la 9.8.
Celle proposée par Virtual Apple est exactement la même.
Je l'ai comparée à la version 9.8 que mon ami Thry2 m'avait envoyée il y a longtemps sous forme de .dsk, grâce à l'outil FAST COMPARE.
Il s'avère qu'un bon nombre de secteurs sont différents mais j'ignore à quoi correspondent ces modifications.
Seul Olivier doit le savoir...
J'ai donc privilégié sa version à lui. Si celle de Thry2 vous intéresse, j'ai ça sous le coude et je peux vous l'envoyer.
Mais je ne la mets pas sur cette page pour ne pas multiplier les versions avec un même numéro.

De mon côté, à l'époque, j'avais eu le jeu complet sous le manteau.
Le soft n'était pas encore diffusé et c'était mon ami et collègue de groupe Eddie Hawk qui m'avait passé sa version 8.3 avec pour consigne de ne pas la donner.
Il y a là aussi des secteurs différents. Un des changements se voit tout de suite: sur la version 8.3, il n'y a pas de boot counter contrairement à la 9.8 (ce qui du coup permet de booter plus vite!) et sur la signature la lettre O est remplacée par un zéro (O barré), façon Br0derbund (et ses créateurs - les Carlstons, ... - originaires des Nordics, et plus précisement de Suède).

Comparaison visuelle 8.3 / 9.8:

Ecran Flobynoid
Ecran Flobynoid

Après, il faut jouer pour peut-être voir les écarts.

Sur la 8.3, les scores mentionnent quelques users de l'Underground FR.
Sur la 9.8, les scores ont été pourris au secteur éditeur par les groupes français The Brain Trust et The MVGang.
Ces mégalos voulaient ainsi voir toujours leurs noms de groupe en 1er...
Des différences dans les fonts utilisées...

Ecran Flobynoid
Ecran Flobynoid

Pour avoir les scores sur la page du menu principal sans attendre la fin d'une partie, appuyez sur la touche flèche gauche.
Les high scores s'incrustent sur l'écran (ici la 8.3):

Ecran Flobynoid

Quelques notes sur la 9.8:
- un message T$02 S$0A: "DANS LA VIE, IL Y A CEUX QUI CREUSENT... ET LES AUTRES. SSS."
- numéro du boot: T$06 S$0E.
- un message T$0B S$05: "WHAT ARE YOU LOOKING FOR, SILLY BOY !!!"
- un message (de fin?) T$16 S$06: "QUELQUE PART, DANS L'ESPACE INFINI... LE FL0BYNOID REGAGNE SA BASE... SA MISSION TERRESTRE TERMINEE !!!"


J'ai mis la vieille version 8.3 en disk image à la fin de cette page mais ce n'est pas celle là que j'ai patchée.
Je ne me suis occupé que de la 9.8.
Ce qui nous intéresse en 1er lieu ici, c'est le boot.

Contrairement à la démo, ACS a été plus raisonnable quant à l'emploi des softswitchs pour le remplissage du latch.
On a ici du classique $C0EC, c'est à dire un $C08C,X avec X forcé sur le slot 6 et pas de $C0E0/$C080,X.

Sinon, grosso modo, le boot du jeu est sensiblement le même que celui de la démo!

La lecture des champs adresse est toujours zappée avec la conséquence directe que l'on sait: le plantage dans certains cas avec Applewin. Ceci concerne aussi bien la version 8.3 que la version 9.8.
(A noter que le boot1 de la version 8.3 n'a pas le même point d'entrée dans le boot 2 que la version 9.8: $BAD8 au lieu de $B600).
Pour le patch de la démo, j'avais repris un Accolad-boot simplifié.
Ici, on va faire encore plus simple. Puisque l'on connait les numéros de secteurs physiques à charger, on ne va pas s'embêter à faire de l'interleaving avec des numéros de secteurs logiques. Voir le cours sur l'interleaving si ce que je dis vous échappe.
Ainsi que le cours de Godfather sur le boot Accolade.

On va réutiliser la routine de la rom du controleur de disquette qui charge un secteur physique de la piste courante.
Comme elle fait à chaque fois un JMP $0801 après chargement, on met un RTS en $0801. Et hop, elle devient la sous-routine de chargement du boot 1.
Il n'y a plus qu'à appeler ce code en $C65C après avoir sélectionné le secteur physique à loader.
Le boot1 devient juste un petit physical-loader avec une boucle qui lit la table des secteurs désirés et fait le JSR qui va bien.
Détail du loading:

Buffer  Physical sector
$B600 : T$00 S$02
$B700 : T$00 S$04
$B800 : T$00 S$06
$B900 : T$00 S$08
$BA00 : T$00 S$0A
$BB00 : T$00 S$0C
$BC00 : T$00 S$0E
$BD00 : T$00 S$00

Et voila le tour est joué... :-)))
Pour plus de détail, le source est en bas de cette page.

Snapshots

Quelques images du jeu.
Je n'ai pas la doc, mais ce n'est pas génant pour jouer.
D'une manière générale, les touches se trouvent sans problème. C'est intuitif.
Evidemment, il doit bien y avoir ici et là des Easter Eggs et autres touches planquées mais je n'ai pas la liste.
En appuyant sur une touche de 1 à 9 au démarrage, cela permet de commencer au tableau de la dizaine correspondante.
J'ai aussi vu qu'il était possible de sauvegarder et repartir de la sauvegarde (touche ctrl-L pour le load).

Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid


Par le menu principal, il est possible d'accéder à l'éditeur de tableaux.

Ecran Flobynoid
Ecran Flobynoid

Pour créer son data disk, il faut commencer par le formatage de celui-ci via l'option F:

Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid

Quand c'est ok, vous passez en mode édition après avoir sélectionné le tableau que vous voulez dessiner.
Utilisez la touche B pour choisir la brique (appuyez plusieurs fois sur B pour la faire changer) et la touche espace pour poser cette brique.

Il y a comme choix:
- Brique cassable en 1 coup
- Brique cassable en 2 coup
- Brique incassable

Ici j'ai fait à la va-vite un tableau avec les lettres: HI!
J'ai choisi un libellé correspondant au nom du level: TEST HI.
Quand je lance le jeu en sélectionnant le data disk et en choisissant mon niveau, je peux m'amuser avec (et le tester).

Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid
Ecran Flobynoid


Disk images .DSK


Floppy
Fast Boot
Download patched Flobynoid 9.8 (version 2002) for Applewin (gzipped)
Floppy
Fast Boot
Download Flobynoid 8.3 -older original version (gzipped)
Floppy
DOS 3.3
Download new Flobynoid boot 1 source code for release 9.8 (gzipped)

File: Flobynoid_Src.dsk
Disk: DOS 3.3 Volume 254 (140KB)
 Name                             Type Auxtyp Modified         Format   Length
------------------------------------------------------------------------------
 DISK*                            BAS  $0801  [No Date]        DOS         119
 T.FLOBY.BOOT1.NEW                TXT  $0000  [No Date]        DOS        2547
 FLOBY.BOOT1.NEW                  BIN  $0800  [No Date]        DOS         256
 INSTALL.SPEEDY                   BAS  $0801  [No Date]        DOS        1560
------------------------------------------------------------------------------


Nouveau boot 1 avec un physical-load


:asm
                1   
                2                                   ; LST OFF
                3                  ORG    $0800    
                4   
                5    ********************************
                6    *                              *
                7    *   Nouveau boot1 FLOBYNOID    *
                8    *        FOR APPLEWIN!         *
                9    *      (c)2007 by Deckard      *
                10   *                              *
                11   ********************************
                12  
                13   * Adresses page 0
                14  
                15   BUFF_LOW      EQU    $26      
                16   BUFF_HIGH     EQU    $27      
                17   SECTOR        EQU    $3D      
                18   TRACK         EQU    $41       ; must be 0!
                19  
                20   * Adresse rom
                21  
                22   HC65C         EQU    $C65C     ; routine load sector
                23   INIT          EQU    $FB2F    
                24   SETKBD        EQU    $FE89    
                25   SETVID        EQU    $FE93    
                26   HOME          EQU    $FC58    
                27   WAIT          EQU    $FCA8    
                28  
                29   ********************************
                30  
0800: 01        31                 DFB    1         ; un seul secteur à charger
                32  
                33   ********************************
                34  
                35   FLOBY_BOOT1                   
0801: E0 60     36                 CPX    #$60      ; boot from slot 6?
0803: F0 03     37                 BEQ    :1        ; yes
                38  
0805: 4C 9A 08  39                 JMP    BAD_SLOT  ; no. sorry, can't run
                40  
                41                                  ; $60=RTS nécessaire car la routine de load
0808: 8E 01 08  42   :1            STX    FLOBY_BOOT1 ; utilisée ($C65C) finit par un JMP $0801
                43  
                44   * Chargement boot2
                45  
080B: A9 B6     46                 LDA    #>$B600   ; buffer implantation $B600-$BDFF
080D: 85 27     47                 STA    BUFF_HIGH
                48  
080F: CE FF 08  49   :3            DEC    NB_SECT   ; [7-0]
0812: 30 0C     50                 BMI    :2        ; fin
                51  
0814: AE FF 08  52                 LDX    NB_SECT   ; traite index courant
0817: BD 77 08  53                 LDA    SECTP_BOOT2,X ; secteur physique
081A: 20 6A 08  54                 JSR    LOADP     ; physical load
081D: 4C 0F 08  55                 JMP    :3        ; secteur suivant
                56  
                57   * Préparations
                58  
0820: 20 2F FB  59   :2            JSR    INIT      ; inits
0823: 20 93 FE  60                 JSR    SETVID   
0826: 20 89 FE  61                 JSR    SETKBD   
                62  
0829: A9 8E     63                 LDA    #<$BB8E   ; reset
082B: 8D F2 03  64                 STA    $03F2    
082E: A9 BB     65                 LDA    #>$BB8E  
0830: 8D F3 03  66                 STA    $03F3    
0833: 49 A5     67                 EOR    #$A5      ; funny complement
0835: 8D F4 03  68                 STA    $03F4    
                69  
0838: 20 58 FC  70                 JSR    HOME     
                71  
083B: A9 DF     72                 LDA    #"_"      ; affichage haut titre
083D: A0 00     73                 LDY    #0       
083F: 99 37 04  74   :4            STA    $0437,Y  
0842: C8        75                 INY             
0843: C0 0B     76                 CPY    #$0B     
0845: D0 F8     77                 BNE    :4       
                78  
0847: A0 00     79                 LDY    #0        ; affichage Flobynoid
0849: B9 7F 08  80   :5            LDA    FLOBY,Y  
084C: 99 B5 04  81                 STA    $04B5,Y  
084F: C8        82                 INY             
0850: C0 0F     83                 CPY    #$0F     
0852: D0 F5     84                 BNE    :5       
                85  
0854: A0 00     86                 LDY    #0        ; affichage version
0856: B9 8E 08  87   :6            LDA    VERSION,Y
0859: 99 B7 05  88                 STA    $05B7,Y  
085C: C8        89                 INY             
085D: C0 0C     90                 CPY    #$0C     
085F: D0 F5     91                 BNE    :6       
                92  
0861: 8D 00 C0  93                 STA    $C000    
0864: 8D 0C C0  94                 STA    $C00C    
0867: 4C 00 B6  95                 JMP    $B600     ; boot2
                96  
                97  
                98   ********************************
                99   *                              *
                100  * Charge un secteur physique   *
                101  * de la piste $00              *
                102  *                              *
                103  ********************************
                104 
                105  * In : acc   = secteur physique à lire
                106  *
                107  * Out: BUFF_HIGH a été incrémenté par la routine rom
                108 
                109  LOADP                         
086A: 85 3D     110                STA    SECTOR   
086C: A2 00     111                LDX    #$00     
086E: 86 26     112                STX    BUFF_LOW 
0870: 86 41     113                STX    TRACK    
0872: A2 60     114                LDX    #$60      ; slot*16
0874: 4C 5C C6  115                JMP    HC65C     ; routine LOAD de la carte controleur+RTS
                116 
                117  *-------------------------------
                118 
                119  * Secteurs physiques du boot 2 à charger
                120  * en ordre inversé
                121  * Logiques:   HEX    0008090A0B0C0D0E
0877: 00 0E 0C  122  SECTP_BOOT2   HEX    000E0C0A08060402
087A: 0A 08 06 04 02
                123 
                124  ********************************
                125 
087F: A8 BA     126  FLOBY         ASC    "(:"
0881: 20        127                ASC    ' '      
0882: 06 0C 0F  128                INV    'FLOBYNOID'
0885: 02 19 0E 0F 09 04
088B: 20        129                ASC    ' '      
088C: BA A9     130                ASC    ":)"
                131 
088E: D6 E5 F2  132  VERSION       ASC    "Version 9.8 "
0891: F3 E9 EF EE A0 B9 AE B8
0899: A0
                133 
                134  ********************************
                135 
089A: 20 58 FC  136  BAD_SLOT      JSR    HOME     
089D: A0 00     137                LDY    #0       
089F: B9 AD 08  138  :1            LDA    TXT_BAD_SLOT,Y
08A2: 99 00 04  139                STA    $0400,Y  
08A5: C8        140                INY             
08A6: C0 0E     141                CPY    #$0E     
08A8: D0 F5     142                BNE    :1       
                143 
08AA: 4C 00 E0  144                JMP    $E000     ; the end
                145 
08AD: 02        146  TXT_BAD_SLOT  INV    'B'
08AE: CF CF D4  147                ASC    "OOT "   
08B1: A0
08B2: 13        148                INV    'S'
08B3: CC CF D4  149                ASC    "LOT "   
08B6: A0
08B7: 13        150                INV    'S'
08B8: C9 D8 AE  151                ASC    "IX."
                152 
                153  ********************************
                154 
08BB: 00 00 00  155                DS     61,0     
...
08F6: 00 00
                156 
08F8: C4 C5 C3  157                ASC    "DECKARD"
08FB: CB C1 D2 C4
                158 
08FF: 08        159  NB_SECT       DFB    8         ; nbr de secteurs à charger
                160 
                161                SAV    FLOBY.BOOT1.NEW

Object saved as FLOBY.BOOT1.NEW,A$0800,L$0100



--End assembly, 256 bytes, Errors: 0


Symbol table - alphabetical order:

   BAD_SLOT     =$089A      BUFF_HIGH    =$27        BUFF_LOW     =$26        FLOBY        =$087F
   FLOBY_BOOT1  =$0801      HC65C        =$C65C      HOME         =$FC58      INIT         =$FB2F
   LOADP        =$086A      NB_SECT      =$08FF      SECTOR       =$3D        SECTP_BOOT2  =$0877
   SETKBD       =$FE89      SETVID       =$FE93      TRACK        =$41        TXT_BAD_SLOT =$08AD
   VERSION      =$088E   ?  WAIT         =$FCA8  


Symbol table - numerical order:

   BUFF_LOW     =$26        BUFF_HIGH    =$27        SECTOR       =$3D        TRACK        =$41
   FLOBY_BOOT1  =$0801      LOADP        =$086A      SECTP_BOOT2  =$0877      FLOBY        =$087F
   VERSION      =$088E      BAD_SLOT     =$089A      TXT_BAD_SLOT =$08AD      NB_SECT      =$08FF
   HC65C        =$C65C      INIT         =$FB2F      HOME         =$FC58   ?  WAIT         =$FCA8
   SETKBD       =$FE89      SETVID       =$FE93