Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.65 - CLIENT : 54.198.158.24

 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 

Tetris (Spectrum Holobyte, 1987)

 
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: 174

MessagePosté le: Sam 27 Fév 2016, 2:38    Sujet du message: Tetris (Spectrum Holobyte, 1987) Répondre en citant

Everyone knows Tetris. :-)
This one is the double-hires version for the Apple II.
It uses the E7 trick, and every track is in 18-sector format.
It also saves the high scores (press 'R' to reset the table).

To defeat the E7 trick, we just use the universal E7 sector.
For the 18-sector tracks, there aren't enough spare sectors to just move things around like The Last Ninja. Instead, I extracted the regions and compressed them individually, similar to Prince of Persia. Fortunately, no region was so large that I had to use any tricks. The compressed version sits in the original location. The read request loads into a private buffer and the decompresses to the original location.
I moved the highscores to a sector-aligned address, so that the write routine needs to write only a single sector.

I'll post some code next time.


Derničre édition par qkumba le Sam 27 Fév 2016, 20:02; édité 1 fois
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 2928
Localisation: Le Chesnay, France

MessagePosté le: Sam 27 Fév 2016, 9:00    Sujet du message: Répondre en citant

Good job!
Will you also do the 64K version?
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: 174

MessagePosté le: Sam 27 Fév 2016, 16:53    Sujet du message: Répondre en citant

Yes, it is next on the list. I believe that it will be matter of only changing my region tables a little bit. That will make more sense when I show the details of the 128k version.
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: 174

MessagePosté le: Sam 27 Fév 2016, 20:03    Sujet du message: Répondre en citant

Here is my 18-to-16 loader, with dynamic decompression:

Code:
      ;fetch the command pointer
$D000:
      PLA
      STA   $0A
      PLA
      STA   $0B
$D006:
      ;construct denibbilisation table on first pass
      LDY   #$40
      BEQ   $D041
      LDX   #$80
$D00C:
      STX   $3C
      TXA
      ASL
      BIT   $3C
      BEQ   $D024
      ORA   $3C
      EOR   #$FF
      AND   #$7E
$D01A:
      BCS   $D024
      LSR
      BNE   $D01A
      DEY
      TYA

      ;store it in our private buffer
      ;no reason except to keep game memory pure
      STA   $D2E3,X
$D024:
      DEX
      BNE   $D00C
      STY   $D007

      ;update soft-switches depending on slot
      LDA   $FD
      ORA   #$80
      STA   $D0BF
      ORA   #$08
      STA   $D079
      ORA   #$04
      STA   $D0F2
      STA   $D279
      STA   $D28E
$D041:
      ;fetch command
      JSR   $D068
      ;throw away error loop bit
      ;but keep track advance bit
      ASL
      PHP
      AND   #$1E
      TAX
      ;dispatch
      JSR   $D057
      ;remember advance state
      PLP
      BPL   $D051
      ;adjust track, but no seek yet
      INC   $FE
$D051:
      ;adjust return address
      JSR   $D068
      ;return to caller
      JMP   ($000A)
$D057:
      JMP   ($D05A,X)
$D05A:      .WORD $D071   ;drive on
      .WORD $D078   ;drive off
      .WORD $D07C   ;seek
      .WORD $D0FC   ;read 18 (now 16)
      .WORD $D0FA   ;read n
      .WORD $8D00   ;write 18 (loaded as part of separate track)
$D068:
      INC   $0A
      BNE   $D06E
      INC   $0B
$D06E:
      LDA   ($0A)
      RTS
$D071:
      ;discard delay and fetch drive number
      JSR   $D068
      JSR   $D068
      ;drive on
      INY
$D078:
      ;adjust motor state
      LDA   $C0E8,Y
      RTS
$D07C:
      ;discard relative track and fetch new track
      JSR   $D068
      JSR   $D068
      STA   $FE
$D084:
      ;seek
      STZ   $FA
      LDA   $FE
      ASL   A
      STA   $FC
$D08B:
      LDA   $FF
      STA   $FB
      SEC
      SBC   $FC
      BEQ   $D0F6
      BCS   $D09C
      EOR   #$FF
      INC   $FF
      BCC   $D09F
$D09C:
      DEC
      DEC   $FF
$D09F:
      CMP   $FA
      BCC   $D0A5
      LDA   $FA
$D0A5:
      CMP   #$08
      BCS   $D0AB
      TAY
      SEC
$D0AB:
      ;size-optimised step
      LDA   $FF
      LDX   $D0D1,Y
      BNE   $D0B8
$D0B2:
      CLC
      LDA   $FB
      LDX   $D0D9,Y
$D0B8:
      STX   $3C
      AND   #$03
      ROL
      TAX
$D0BE:
      STA   $C0E0,X
$D0C1:
      LDX   #$13
$D0C3:
      DEX
      BNE   $D0C3
      DEC   $3C
      BNE   $D0C1
      LSR
      BCS   $D0B2
      INC   $FA
      BNE   $D08B
      .BYTE 1, $30, $28, $24,   $20, $1E, $1D, $1C
      .BYTE $70, $2C,   $26, $22, $1F, $1E, $1D, $1C
      .BYTE 0, $D, $B, 9, 7, 5, 3, 1,   $E, $C,   $A, 8, 6, 4, 2, $F
$D0F1:
      LDA   $C0EC
      BPL   $D0F1
$D0F6:
      RTS
$D0F7:
      ;skip fetch address in read-18 mode
      PLP
      BCS   $D10C
$D0FA:      CLC
      .BYTE $A9
$D0FC:
      SEC
$D0FD:
      ;skip empty slots
      JSR   $D068
      BEQ   $D10C
      ;check X=0 without affecting carry or destroying A
      PHX
      PLX
      BEQ   $D10C
$D106:
      ;save address and sector on first pass
      STA   $03
      STY   $02
      LDX   #$00
$D10C:
      ;until 16 sectors counted
      INY
      PHP
      CPY   #$10
      BCC   $D0F7
      ;in read-n mode count up to 18 to complete array parse
      PLP
      BCS   $D119
      CPY   #$12
      BNE   $D0FD
$D119:
      ;index into region table
      LDA   $FE
      ASL
      TAX
      LDY   $02
      BEQ   $D122
      INX
$D122:
      ;fetch compressed sector count
      LDA   $D2B3,X
      TAX
      ;select buffer address
      LDA   $03
      ASL
      ;$d500 if compressed
      LDA   #$D5
      BCC   $D12F
      ;$84 of not (track $22 holds highscores, not compressed)
      LDA   #$84
$D12F:
      PHP
      ;read sectors
      JSR   $D219
      ;return if not compressed
      PLP
      BCS   $D0F6
      ;aPLib unpacker
      STZ   $00
      STZ   $02
      STZ   $06
      STZ   $05
$D13E:
      JSR   $D204
      LDY   #$02
$D143:
      JSR   $D161
      BCC   $D13E
      JSR   $D161
      BCC   $D185
      JSR   $D161
      BCS   $D16D
      JSR   $D210
      LSR
      BEQ   $D16C
      STZ   $04
      ROL   $04
      TAX
      STZ   $07
      BRA   $D1AD
$D161:
      ASL   $06
      BNE   $D16C
      JSR   $D210
      SEC
      ROL
      STA   $06
$D16C:
      RTS
$D16D:
      LDY   #$01
      STY   $04
      INY
      LDA   #$10
$D174:
      PHA
      JSR   $D161
      PLA
      ROL
      BCC   $D174
      STZ   $09
      BNE   $D1C0
      JSR   $D207
$D183:
      BRA   $D143
$D185:
      JSR   $D1E7
$D188:
      JSR   $D1FA
      DEY
      BNE   $D188
      TAY
      ORA   $05
      BEQ   $D19B
      DEY
      STY   $07
      JSR   $D210
      TAX
      .BYTE $A9
$D19B:
      INY
      JSR   $D1E7
      CPY   #$7D
      BCS   $D1AD
      CPY   #$05
      BCS   $D1B3
      TXA
      BMI   $D1B9
      TYA
      BNE   $D1B9
$D1AD:
      INC   $04
      BNE   $D1B3
      INC   $05
$D1B3:
      INC   $04
      BNE   $D1B9
      INC   $05
$D1B9:
      LDY   #$01
      LDA   $07
      STA   $09
      TXA
$D1C0:
      STA   $08
      LDA   $01
      PHA
      LDA   $00
      PHA
      LDA   $02
      SEC
      SBC   $08
      STA   $00
      LDA   $03
      SBC   $09
      STA   $01
$D1D5:
      JSR   $D204
      JSR   $D1FA
      ORA   $05
      BNE   $D1D5
      PLA
      STA   $00
      PLA
      STA   $01
      BRA   $D183
$D1E7:
      LDA   #$01
      STA   $04
      STZ   $05
$D1ED:
      JSR   $D161
      ROL   $04
      ROL   $05
      JSR   $D161
      BCS   $D1ED
      RTS
$D1FA:
      LDA   $04
      BNE   $D200
      DEC   $05
$D200:
      DEC   $0A
      STA   $04
      RTS
$D204:
      JSR   $D210
$D207:
      STA   ($02)
      INC   $02
      BNE   $D20F
      INC   $03
$D20F:
      RTS
$D210:
      LDA   ($00)
      INC   $00
      BNE   $D218
      INC   $01
D218:
      RTS
$D219:
      ;zero sector array
      STX   $F9
      STX   $F8
      LDX   #$10
$D21F:
      STZ   $D362,X
      DEX
      BNE   $D21F
      STA   $01
$D227:
      ;translate sector (for more human-readable disk layout)
      ;and store address
      LDX   $D0E1,Y
      STA   $D363,X
      INC
      INY
      DEC   $F9
      BNE   $D227
      ;seek
      JSR   $D084
$D236:
      ;preset 2-bit array location
      LDA   #$C9
      STA   $41
      LDA   #$D2
      STA   $42
      LDX   #$00
$D240:
      ;read nibble
      JSR   $D0F1
$D243:
      CMP   #$D5
      BNE   $D240
      JSR   $D0F1
      CMP   #$AA
      BNE   $D243
      TAY
      JSR   $D0F1
      ;if not #$AD then #$96 is assumed
      EOR   #$AD
      BEQ   $D272
      ;volume/track/sector only
      LDX   #$03
      STA   $3C
$D25A:
      JSR   $D0F1
      ROL
      STA   $3C
      JSR   $D0F1
      AND   $3C
      DEX
      BNE   $D25A
      STA   $3C
      TAY
      ;fetch corresponding address
      LDX   $D363,Y
      STX   $FA
      BCS   $D240
$D272:
      ;return if wrong mode
      CPX   #$00
      BEQ   $D240
      .BYTE $90
$D277:
      CLC
$D278:
      ;store array to pass-dependent location
      LDX   $C0EC
      BPL   $D278
      EOR   $D263,X
      STA   ($41),Y
      INY
      BNE   $D278
      ;switch addresses
      STY   $41
      LDX   $FA
      STX   $42
      ;carry is set on first pass to force loop
      BCS   $D277
$D28D:
      ;check checksum
      LDX   $C0EC
      BPL   $D28D
      EOR   $D263,X
      BNE   $D236
      ;zero address on success
      LDX   $3C
      STA   $D363,X
$D29C:
      ;6-and-2 decode
      LDX   #$A9
$D29E:
      INX
      BEQ   $D29C
      LDA   ($41),Y
      LSR   $D2C9,X
      ROL
      LSR   $D2C9,X
      ROL
      STA   ($41),Y
      INY
      BNE   $D29E
      DEC   $F8
      BNE   $D236
      RTS
      ;region table
      ;number of sectors to read per region
      ;maximum of two regions per track
      .BYTE   9, 2 ;track $01
      .BYTE  $B, 2 ;track $02
      .BYTE  $B, 0 ;track $03
      .BYTE  $B, 0 ;track $04
      .BYTE   8, 2 ;track $05
      .BYTE   8, 3 ;track $06
      .BYTE   8, 3 ;track $07
      .BYTE  $B, 0 ;track $08
      .BYTE   8, 3 ;track $09
      .BYTE  $A, 0 ;track $0a
      .BYTE   9, 0 ;track $0b
      .BYTE   8, 5 ;track $0c
      .BYTE   8, 4 ;track $0d
      .BYTE   8, 5 ;track $0e
      .BYTE   9, 3 ;track $0f
      .BYTE   9, 0 ;track $10
      .BYTE  $A, 0 ;track $11
      .BYTE   7, 5 ;track $12
      .BYTE   9, 0 ;track $13
      .BYTE   9, 0 ;track $14
      .BYTE   6, 4 ;track $15
      .BYTE   6, 4 ;track $16
      .BYTE   4, 4 ;track $17
      .BYTE   4, 4 ;track $18
      .BYTE   7, 6 ;track $19
      .BYTE   6, 6 ;track $1a
      .BYTE   5, 5 ;track $1b
      .BYTE   5, 5 ;track $1c
      .BYTE   5, 5 ;track $1d
      .BYTE   5, 5 ;track $1e
      .BYTE   5, 0 ;track $1f
      .BYTE  $B, 0 ;track $20
      .BYTE  $B, 0 ;track $21
      .BYTE  $10, 0 ;track $22
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: 174

MessagePosté le: Lun 29 Fév 2016, 21:32    Sujet du message: Répondre en citant

and now the 48k version is done. They didn't even try with that one. Apart from the #$E7 protection, it uses RW18 to read 18 sectors from one track and then 14 sectors from the next track. 18+14=32... It was a simple matter to use a 16-sector RWTS instead.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 2928
Localisation: Le Chesnay, France

MessagePosté le: Mar 01 Mar 2016, 10:06    Sujet du message: Répondre en citant

Congratulations!
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