Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.1 - CLIENT : 54.166.212.152

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Snoggle (Broderbund, 1981)

 
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
qkumba



Inscrit le: 29 Jan 2012
Messages: 171

MessagePosté le: Ven 11 Mar 2016, 1:05    Sujet du message: Snoggle (Broderbund, 1981) Répondre en citant

This is the renamed and slightly reworked Puck Man, no doubt due to legal threats.

Code:
8600<C600.C6FCM
86F9:69 FF
8600G


Our bootsector starts like this:

Code:
      .BYTE   1
      LDX   #$00
$0803:
      LDA   $0800,X
      STA   $0200,X
      INX
      BNE   $0803
      JMP   $020F


So let's list it at $0200. At $020F, we have this:

Code:
      LDY   #$AB ;generate a denibbilisation table
$0211:
      TYA
      STA   $3C
      LSR
      ORA   $3C
      CMP   #$FF
      BNE   $0824
      CPY   #$D5
      BEQ   $0824
      TXA
      STA   $0800,Y
      INX
$0224:
      INY
      BNE   $0811
      STY   $3D ;sector 0?  It's not the one that we know.
      STY   $26
      LDA   #$03
      STA   $27 ;to $0300
      LDX   $2B

      ;read sector

      JSR   $025D

      ;denibbilise sector

      JSR   $02D1

      ;run new code

      LDA   #$A9
      STA   $031F
      LDA   #$02
      STA   $0320
      JMP   $0301


So sector 0 again? How can it be? Let's see.
A prologue of #$D5 #$AA #$B5 is for a 5-and-3 sector.
So this disk has a 6-and-2 bootsector and a 5-and-3 bootsector.
It can boot on either version of the hardware.

Code:
$025D:
      CLC
$025E:
      PHP
$025F:
      LDA   $C08C,X
      BPL   $025F
$0264:
      EOR   #$D5
      BNE   $025F
$0268:
      LDA   $C08C,X
      BPL   $0268
      CMP   #$AA
      BNE   $0264
      NOP
$0272:
      LDA   $C08C,X
      BPL   $0272
      CMP   #$B5
      BEQ   $0284
      PLP
      BCC   $025D
      EOR   #$AD
      BEQ   $02A1
      BNE   $025D
$0284:
      LDY   #$03
      STY   $2A
$0288:
      LDA   $C08C,X
      BPL   $0288
      ROL
      STA   $3C
$0290:
      LDA   $C08C,X
      BPL   $0290
      AND   $3C
      DEY
      BNE   $0288
      PLP
      CMP   $3D
      BNE   $025D
      BCS   $025E
$02A1:
      LDY   #$9A
$02A3:
      STY   $3C
$02A5:
      LDY   $C08C,X
      BPL   $02A5
      EOR   $0800,Y
      LDY   $3C
      DEY
      STA   $0800,Y
      BNE   $02A3
$02B5:
      STY   $3C
$02B7:
      LDY   $C08C,X
      BPL   $02B7
      EOR   $0800,Y
      LDY   $3C
      STA   ($26),Y
      INY
      BNE   $02B5
$02C6:
      LDY   $C08C,X
      BPL   $02C6
      EOR   $0800,Y
      BNE   $025D
      RTS

      ;decode 5-and-3

$02D1:
      TAY
$02D2:
      LDX   #$00
$02D4:
      LDA   $0800,Y
      LSR
      ROL   $03CC,X
      LSR
      ROL   $0399,X
      STA   $3C
      LDA   ($26),Y
      ASL
      ASL
      ASL
      ORA   $3C
      STA   ($26),Y
      INY
      INX
      CPX   #$33
      BNE   $02D4
      DEC   $2A
      BNE   $02D2
      CPY   $0300
      BNE   $02FC
      RTS
      .BYTE   0
      .BYTE   0
$02FC:
      JMP   $FF2D


We need to break before $301 is executed.

Code:
8600<C600.C6FCM
86F8:A9 69 8D 42 8 A9 FF 8D 43 8 4C 1 8
8600G


Let's see what's there:

Code:
      ;shift denibbilisation table a bit
$0301:
      LDA   $0800,Y
      ASL
      ASL
      ASL
      STA   $0800,Y
      INY
      BNE   $0301
      LDX   $2B
      LDA   #$09
      STA   $27

      ;to $B600+

      LDA   $03CC
      STA   $41
      STY   $40

      ;convert address to slot

      TXA
      LSR
      LSR
      LSR
      LSR

      ;this was ORA #$C0 originally
      ;for old hardware, the original instruction will be used
      ;for new hardware, the manual loader must be used instead

      LDA   #$02
      STA   $3F
      LDA   #$5D
      STA   $3E
$0327:
      ;read sector
      ;uses the 5-and-3 loader from earlier

      JSR   $0343

      ;decode sector
      ;a different decoder entirely
      ;functionally equivalent but much faster

      JSR   $0346

      ;fetch more sectors

      LDA   $3D
      EOR   $03FF
      BEQ   $033A
      INC   $41
      INC   $3D
      BNE   $0327

      ;point to newly loaded code

$033A:
      STA   $3E
      LDA   $03CC
      STA   $3F
      INC   $3F

      ;jump to current pointer

$0343:
      JMP   ($3E)

$0346:
      LDX   #$32
      LDY   #$00
$034A:
      LDA   $0800,X
      LSR
      LSR
      LSR
      STA   $3C
      LSR
      STA   $2A
      LSR
      ORA   $0900,X
      STA   ($40),Y
      INY
      LDA   $0833,X
      LSR
      LSR
      LSR
      LSR
      ROL   $3C
      LSR
      ROL   $2A
      ORA   $0933,X
      STA   ($40),Y
      INY
      LDA   $0866,X
      LSR
      LSR
      LSR
      LSR
      ROL   $3C
      LSR
      ROL   $2A
      ORA   $0966,X
      STA   ($40),Y
      INY
      LDA   $2A
      AND   #$07
      ORA   $0999,X
      STA   ($40),Y
      INY
      LDA   $3C
      AND   #$07
      ORA   $09CC,X
      STA   ($40),Y
      INY
      DEX
      BPL   $034A
      LDA   $0899
      LSR
      LSR
      LSR
      ORA   $09FF
      STA   ($40),Y
      LDX   $2B
      RTS


we need to break at $33A, to capture the DOS.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 171

MessagePosté le: Ven 11 Mar 2016, 1:06    Sujet du message: Répondre en citant

Code:
8600<C600.C6FCM
86F8:A9 5 8D 42 8 A9 87 8D 43 8 4C 1 8 A9 4C 8D 3A 3 A9 69 8D 3B 3 A9 FF 8D 3C 3 4C 1 3
8600G


This looks a bit like regular DOS.

Code:
$B700:
      STX   $B763
      STX   $B771
      TXA
      LSR
      LSR
      LSR
      LSR
      TAX
      LDA   #$00
      STA   $4F8,X
      STA   $478,X
      TAY

      ;except for this part...
      ;copy table to screen memory
      ;and then delete the original
      ;this is important later

$B715:
      LDA   $B7CD,Y
      STA   $400,Y
      TYA
      STA   $B7CD,Y
      INY
      CPY   #$18
      BNE   $B715

      ;lores mode

      LDA   $C050
      LDA   $C052
      LDA   $C055

      ;load title

      LDA   #$01
      STA   $3E
      LDA   #$05
      STA   $42
      LDA   #$00
      STA   $B76A
      LDA   #$20
      STA   $B76B
      JSR   $B777

      ;show it

      JSR   $6000

      ;load game

      LDA   #$40
      STA   $B7BC
      LDA   #$06
      STA   $3E
      LDA   #$0A
      STA   $42
      LDA   #$00
      STA   $B76A
      LDA   #$08
      STA   $B76B
      JSR   $B777

      ;run it

      JMP   $4A77


Nothing special there.

Code:
      ;set track in IOB

$B777:
      LDA   $3E
      STA   $B766

      ;play a sound
      ;for no reason
$B77C:
      JSR   $B7BB
      LDA   #$00
      STA   $B767
      JSR   $B7AC


Still not interesting, but wait!

Code:
      ;fetch address prologue byte from screen memory
      ;so the middle of #$D5 #$AA #$B5 varies based on track

$B7AC:
      LDY   $B766
      LDA   $400,Y
      ORA   #$AA
      STA   $BEFA
      STA   $B980
      RTS


Okay, so that's not a problem if we trap after the read.
It looks like someone wasn't careful while patching the DOS, because this is the delay when the drive is spinning up:

Code:
      LDY   #7
$BD7E:
      JSR   $BA7F
      DEY
      BNE   $BD7E
      LDX   $05F8


but at $BA7F, we have this:

Code:
$BA7B:
      LDX   #$11
      DEX
      .BYTE $D0
$BA7F:
      SBC   $46E6,X
      BNE   $BA86
      INC   $47
$BA86:
      SEC
      SBC   #$01
      BNE   $BA7B
      RTS


Should be $BA7B. However, it's not a problem for us, either.
Let's break at the title sequence.

Code:
870B:17
8710:87
8717:A9 4C 8D 42 B7 A9 69 8D 43 B7 A9 FF 8D 44 B7 4C 0 B7
8600G
C051
C054


That loaded $2000-60FF.

Code:
$6000:
      LDA   $C057
      LDA   $C054
      LDA   $C052
      LDA   $C050
      LDA   #$03
      STA   $10
      LDA   #$80
      STA   $11
      TAY

      ;change prologue bytes again
      ;#$D5 #$EB #$B5 becomes #$DE #$EB #$B5

      LDA   #$DE
      STA   $B8F6,Y
      STA   $BE75,Y
      LDA   #$52
      STA   $040F

      ;and then erase the evidence
      LDA   #$00
$6024:
      STA   $5FA2,Y
      DEY
      BNE   $6024
      STA   $12

      ;switch between screens

$602C:
      JSR   $603A
      LSR   $11
      ASL   $10
      LDA   $11
      CMP   #$04
      BNE   $602C
      RTS
$603A:
      LDA   $10
      STA   $13
$603E:
      LDA   $11
      STA   $14
$6042:
      JSR   $606C
      JSR   $606C
      DEC   $12
      BNE   $6042
      DEC   $14
      BNE   $6042
      LDA   $C055
      LDA   #$04
      STA   $14
$6057:
      JSR   $606C
      JSR   $606C
      DEC   $12
      BNE   $6057
      DEC   $14
      BNE   $6057
      LDA   $C054
      DEC   $13
      BNE   $603E
$606C:
      RTS


We save that to disk. Almost done. Now we break at the game code.

Code:
8717:A9 69 8D 60 B7 A9 FF 8D 61 B7 4C 0 B7
8600G


That loaded $0800-81FF. We save that to disk.
Place a new DOS (e.g. qboot, see http://pferrie.host22.com/misc/qboot.zip) to load the sectors and we're done.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com