Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.129 - CLIENT : 23.20.166.68

 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 

Bill Budge's Space album (California Pacific, 1980)

 
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
toinet
Site Admin


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

MessagePosté le: Ven 20 Mai 2016, 10:59    Sujet du message: Bill Budge's Space album (California Pacific, 1980) Répondre en citant

#871 - By Bill Budge. A compilation of four arcade games in 3D. You've all played them, I'm sure!

Disk structure
This is a single-sided 13-sec disk with data on T0 to TB. It has the double T0/S0 sector: one for the 13-sec controller card, one for the 16-sec card.
The volume is not 254.
Track 0 is a standard 13-sec track with the usual address and data markers: D5AAB5 DEAAEB / D5AAAD DEAAEB. The other tracks invert them:
- the address field is D5AAAD
- the data field is D5AAB5
What is the funniest in the on-disk change is that the structure of the address field was changed. We normally have the following structure in 4*4 encoded nibbles for VV TT SS CC:
- D5AAB5 VV TT SS CC (VVolume, TTrack, SSector, CChecksum)
But we have:
- D5AAAD VV SS TT CC (VVolume, SSector, TTrack, CChecksum)
So, the IOB table used by the program has the sector at offset $4 and the track at offset $5. That is the difference with a standard one where the track is at offset $4 and the sector at offset $5. Funny!

That reminds me a little bit of the RWTS of Ultima IV: you normally have the low pointer to the IOB table in Y and the high pointer in A. There, you have the low pointer in A and the high one in Y. You are so used to see that code that you do not pay attention to such a minimal change Smile

Some boot trace
Sort of... As we have a 13-sec disk, we know how they boot:
- Boot0 at $C600
- Boot1 at $0800, moves to $0200
- Boot2 at $0300, loads the RWTS
- jumps to $7600

How to copy
What I did is:
- capture the RWTS,
- write a copy program at $2000.
The copy program loads T1-TB at $3000..$3CFF using the program's RWTS entry point at $7900. My code then writes each track on drive 2.
For track 0, I used Advanced demuffin with the DEMU.RWTS3.2 RWTS that is on my copy disk.
Now, we have a non-bootable 16-sec disk.

Some re-organization
First, we moved T0 to TC, the first unused track
We then put a 16-sec RWTS on T0
At $B700, we load TC/S0 - TC/SC starting at $9500
We then path some addresses in RAM: we replace the first three bytes of the entry point of the program's RWTS located at $9600 with a JMP to $B660.
The new entry point of the RWTS is at $B680, we'll swap the TS (Track Sector) information, read the sector with our 16-sec RWTS and swap TS again.
We must also patch our RWTS (see $BE15) to bypass the check of the volume number. By default, we accept any value.
We again patch the RWTS to change the default zero page addresses used to read/change the IOB table. The normal RWTS uses $48/$49. To be compatible with the game, I've changed them to $3A/$3B.
That is a lot of blah blah, the code will help you understand.

The disk image is available at http://www.brutaldeluxe.fr/crack/

Reboot and... enjoy,

LoGo
5/2016


Derničre édition par toinet le Ven 20 Mai 2016, 11:07; édité 2 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: 2886
Localisation: Le Chesnay, France

MessagePosté le: Ven 20 Mai 2016, 11:03    Sujet du message: Répondre en citant

The code to patch the original RWTS at $7900 to redirect to $B680. And the code at $B680 that swaps the TS info, read a sector, and swap again.

Code:

The patch
0060:A9 4C          LDA   #$4C          ; Read at $B680
0062:8D 00 79       STA   $7900         
0065:A9 80          LDA   #$80         
0067:8D 01 79       STA   $7901         
006A:A9 B6          LDA   #$B6         
006C:8D 02 79       STA   $7902         
006F:AE E9 B7       LDX   $B7E9         
0072:4C 00 76       JMP   $7600         
...
0080:84 3A          STY   $3A           ; Save pointer
0082:85 3B          STA   $3B           
0084:20 90 B6       JSR   $B690         ; Exchange
0087:20 04 BD       JSR   $BD04         ; Read
008A:20 90 B6       JSR   $B690         ; Exchange
008D:60             RTS                 
008E:00             BRK                 
008F:00             BRK                 
0090:A0 04          LDY   #$04          ; Get old S
0092:B1 3A          LDA   ($3A),Y       
0094:48             PHA                 ; save
0095:A0 05          LDY   #$05          ; Get old T
0097:B1 3A          LDA   ($3A),Y       
0099:A0 04          LDY   #$04          ; save in new T
009B:91 3A          STA   ($3A),Y       
009D:A0 05          LDY   #$05          ; restore old S
009F:68             PLA                 
00A0:91 3A          STA   ($3A),Y       ; save in new S
00A2:60             RTS                 
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: 2886
Localisation: Le Chesnay, France

MessagePosté le: Ven 20 Mai 2016, 11:05    Sujet du message: Répondre en citant

The original RWTS

Code:

*
* Bill Budge's Space Album
* (c) 1980, California Pacific
*

* A funny protection: TS info on disk is stored as ST

         mx    %11
         org   $7600
         lst   off

*--- Equates

SETKBD   EQU   $FE89
SETVID   EQU   $FE93

L0D00    =     $0D00      ; read buffer (std is $BB00)
L0E00    =     $0E00      ; of the RWTS (std is $BC00)

zp3A     =     $3A        ; iob table ptr (std is $48)
zp3C     =     $3C

dftCMD   =     $01        ; was $00 - RWTS command
dftSLOT16 =    $60        ; was $70 - slot*16

*--- Code

L7600    STX   L76E9
         STX   L76F7
         LDA   #$01
         STA   L76EA
         STA   L76F8
         LDA   L76E0
         STA   L76E1
         LDA   #$01       ; track
         STA   L76ED
         LDA   L76E2      ; sector
         STA   L76EC
         LDA   L76E3      ; address
         STA   L76F0+1
         LDA   #$01
         STA   L76F4      ; read command
         TXA
         LSR
         LSR
         LSR
         LSR
         TAX
         LDA   #$00
         STA   $04F8,X
         STA   $0478,X
         JSR   L7654      ; load code
         LDX   #$FF
         TXS
         STX   L76EB
         JSR   SETVID
         JSR   SETKBD
         LDA   L7683
         STA   $48
         LDA   #$00
         STA   L7683
         JMP   $7D0C      ; end of RWTS init

L7654    LDA   L76E4+1
         LDY   L76E4
         JSR   L7676
         LDY   L76EC      ; sector
         INY
         CPY   #$0D
         BNE   L766A
         LDY   #$00
         INC   L76ED      ; track
L766A    STY   L76EC      ; sector
         INC   L76F0+1    ; address
         DEC   L76E1      ; nb sectors
         BNE   L7654
         RTS

L7676    PHP
         SEI
         JSR   L7900
         BCS   L7680
         PLP
         CLC
         RTS

L7680    PLP
         SEC
         RTS

L7683    DB    $A1
         HEX   F6F90060A516C52E852EF007A517852F
         HEX   4C9D0DA517C52FD0F5201AFCB008A004
         HEX   B128C9A0F0F32042FC4CC9090020CE0A
         HEX   20610C20B00D4CA70D2089F611000212
         HEX   8D00CC297C4951D207FB00A9FF852F20
         HEX   D50D2089F6CC6C3900B0DE4C

L76E0    DB    $09        ; nb of sectors to load ref
L76E1    DB    $00        ; nb of sectors to load
L76E2    DB    $00        ; dft sector
L76E3    DB    $11        ; where to load in RAM
L76E4    DA    L76E8      ; iob table pointer
         DB    $00
         DB    $00

*--- IOB table

L76E8    DB    $01        ; 00
L76E9    DB    dftSLOT16  ; 01 slot*16 (was $70)
L76EA    DB    $01        ; 02 drive
L76EB    DB    $00        ; 03 volume
L76EC    DB    $00        ; 04 sector (dft is track)
L76ED    DB    $00        ; 05 track (dft is sector)
         DA    L76F9      ; 06
L76F0    DA    $0000      ; 08 address
         DB    $00        ; 0A
         DB    $00        ; 0B
L76F4    DB    dftCMD     ; 0C (was $00)
         DB    $00        ; 0D
         DB    $00        ; 0E
L76F7    DB    dftSLOT16  ; 0F (was $70)
L76F8    DB    $01        ; 10
L76F9    HEX   0001EFD8   ; 11

         DB    $2E
         DB    $3F
         DB    $C5

*--- read data field (D5AAB5 ahem)

L7700    LDY   #$20
L7702    DEY
         BEQ   L7766
L7705    LDA   $C08C,X
         BPL   L7705
L770A    EOR   #$D5
         BNE   L7702
         NOP
L770F    LDA   $C08C,X
         BPL   L770F
         CMP   #$AA
         BNE   L770A
         LDY   #$9A
L771A    LDA   $C08C,X
         BPL   L771A
         CMP   #$B5
         BNE   L770A
         LDA   #$00
L7725    DEY
         STY   $26
L7728    LDY   $C08C,X
         BPL   L7728
         EOR   L78AB-$AB,Y
         LDY   $26
         STA   L0E00,Y
         BNE   L7725
L7737    STY   $26
L7739    LDY   $C08C,X
         BPL   L7739
         EOR   L78AB-$AB,Y
         LDY   $26
         STA   L0D00,Y
         INY
         BNE   L7737
L7749    LDY   $C08C,X
         BPL   L7749
         CMP   L78AB-$AB,Y
         BNE   L7766
L7753    LDA   $C08C,X
         BPL   L7753
         CMP   #$DE
         BNE   L7766
         NOP
L775D    LDA   $C08C,X
         BPL   L775D
         CMP   #$AA
         BEQ   L77C2
L7766    SEC
         RTS

*--- read address field (D5AAAD hum)

L7768    LDY   #$F8
         STY   $26
L776C    INY
         BNE   L7773
         INC   $26
         BEQ   L7766
L7773    LDA   $C08C,X
         BPL   L7773
L7778    CMP   #$D5
         BNE   L776C
         NOP
L777D    LDA   $C08C,X
         BPL   L777D
         CMP   #$AA
         BNE   L7778
         LDY   #$03
L7788    LDA   $C08C,X
         BPL   L7788
         CMP   #$AD
         BNE   L7778
         LDA   #$00
L7793    STA   $27
L7795    LDA   $C08C,X
         BPL   L7795
         ROL
         STA   $26
L779D    LDA   $C08C,X
         BPL   L779D
         AND   $26
         STA   |$002C,Y   ; C V S T
         EOR   $27
         DEY
         BPL   L7793
         TAY
         BNE   L7766
L77AF    LDA   $C08C,X
         BPL   L77AF
         CMP   #$DE
         BNE   L7766
         NOP
L77B9    LDA   $C08C,X
         BPL   L77B9
         CMP   #$AA
         BNE   L7766
L77C2    CLC
         RTS

*--- denibblize

L77C4    LDX   #$32
         LDY   #$00
L77C8    LDA   L0E00,X
         LSR
         LSR
         LSR
         STA   $27
         LSR
         STA   $26
         LSR
         ORA   L0D00,X
         STA   ($3E),Y
         INY
         LDA   L0E00+$33,X
         LSR
         LSR
         LSR
         LSR
         ROL   $27
         LSR
         ROL   $26
         ORA   L0D00+$33,X
         STA   ($3E),Y
         INY
         LDA   L0E00+$66,X
         LSR
         LSR
         LSR
         LSR
         ROL   $27
         LSR
         ROL   $26
         ORA   L0D00+$66,X
         STA   ($3E),Y
         INY
         LDA   $26
L7800    AND   #$07
         ORA   L0D00+$99,X
         STA   ($3E),Y
         INY
         LDA   $27
         AND   #$07
         ORA   L0D00+$CC,X
         STA   ($3E),Y
         INY
         DEX
         BPL   L77C8
         LDA   L0E00+$99
         LSR
         LSR
         LSR
         ORA   L0D00+$FF
         STA   ($3E),Y
         RTS

*--- move arm routine

L7821    STX   $2B
         STA   $2A
         CMP   $0478
         BEQ   L787D
         LDA   #$00
         STA   $26
L782E    LDA   $0478
         STA   $27
         SEC
         SBC   $2A
         BEQ   L786B
         BCS   L7841
         EOR   #$FF
         INC   $0478
         BCC   L7846
L7841    ADC   #$FE
         DEC   $0478
L7846    CMP   $26
         BCC   L784C
         LDA   $26
L784C    CMP   #$0C
         BCS   L7851
         TAY
L7851    SEC
         JSR   L786F
         LDA   L788F,Y
         JSR   L787E
         LDA   $27
         CLC
         JSR   L7872
         LDA   L789B,Y
         JSR   L787E
         INC   $26
         BNE   L782E
L786B    JSR   L787E
         CLC
L786F    LDA   $0478
L7872    AND   #$03
         ROL
         ORA   $2B
         TAX
         LDA   $C080,X
         LDX   $2B
L787D    RTS

L787E    LDX   #$11
L7880    DEX
         BNE   L7880
         INC   $46
         BNE   L7889
         INC   $47
L7889    SEC
         SBC   #$01
         BNE   L787E
         RTS

L788F    HEX   01302824201E1D1C1C1C1C1C
L789B    HEX   702C26221F1E1D1C1C1C1C1C
         HEX   1C1C1C1C

*--- The nibble translation table

L78AB    HEX   00010810180203040506202830070938
         HEX   400A4850580B0C0D0E0F111213141516
         HEX   17191A1B1C1D1E212223246068252670
         HEX   7827808890292A2B2C2D2E2F31323398
         HEX   A034A8B0B8353637393AC0C8D03B3CD8
         HEX   E03EE8F0F8

*--- Entry point of the RWTS

L7900    STY   zp3A
         STA   zp3A+1
         LDY   #$02
         STY   $06F8
         LDY   #$04
         STY   $04F8
         LDY   #$01
         LDA   (zp3A),Y
         TAX
         LDY   #$0F
         CMP   (zp3A),Y
         BEQ   L7934
         TXA
         PHA
         LDA   (zp3A),Y
         TAX
         PLA
         PHA
         STA   (zp3A),Y
         LDA   $C08E,X
L7925    LDY   #$08
         LDA   $C08C,X
L792A    CMP   $C08C,X
         BNE   L7925
         DEY
         BNE   L792A
         PLA
         TAX
L7934    LDA   $C08E,X
         LDA   $C08C,X
         LDA   $C08C,X
         PHA
         PLA
         STX   $05F8
         CMP   $C08C,X
         PHP
         LDA   $C089,X
         LDY   #$06
L794B    LDA   (zp3A),Y
         STA   |$0036,Y
         INY
         CPY   #$0A
         BNE   L794B
         LDY   #$03
         LDA   (zp3C),Y
         STA   $47
         LDY   #$02
         LDA   (zp3A),Y
         LDY   #$10
         CMP   (zp3A),Y
         BEQ   L796B
         STA   (zp3A),Y
         PLP
         LDY   #$00
         PHP
L796B    ROR
         BCC   L7973
         LDA   $C08A,X
         BCS   L7976
L7973    LDA   $C08B,X
L7976    ROR   $35
         PLP
         PHP
         BNE   L7987
         LDY   #$07
L797E    JSR   L787E
         DEY
         BNE   L797E
         LDX   $05F8
L7987    LDY   #$05       ; std is $04 ;-)
         LDA   (zp3A),Y
         JSR   L7A16
         PLP
         BNE   L799E
L7991    LDY   #$12
L7993    DEY
         BNE   L7993
         INC   $46
         BNE   L7991
         INC   $47
         BNE   L7991
L799E    LDY   #$0C
         LDA   (zp3A),Y
         SEC
         PHP
L79A4    LDY   #$30
         STY   $0578
L79A9    LDX   $05F8
         JSR   L7768
         BCC   L79D5
L79B1    DEC   $0578
         BPL   L79A9
L79B6    LDA   $0478
         PHA
         LDA   #$60
         JSR   L7A51
         DEC   $06F8
         BEQ   L79EC
         LDA   #$04
         STA   $04F8
         LDA   #$00
         JSR   L7A16
         PLA
L79CF    JSR   L7A16
         JMP   L79A4

L79D5    LDY   $2E        ; read track
         CPY   $0478
         BEQ   L79F5
         LDA   $0478
         PHA
         TYA
         JSR   L7A51
         PLA
         DEC   $04F8
         BNE   L79CF
         BEQ   L79B6
L79EC    PLA
         LDA   #$40
         PLP
         JMP   L7A0D

         BEQ   L7A0B
L79F5    LDY   #$04       ; sector
         LDA   $2F        ; read sector
         CMP   (zp3A),Y
         BNE   L79B1
         PLP
         JSR   L7700
         PHP
         BCS   L79B1
         PLP
         JSR   L77C4
         LDX   $05F8
L7A0B    CLC
         DB    $24
L7A0D    SEC
         LDY   #$0D
         STA   (zp3A),Y
         LDA   $C088,X
         RTS

L7A16    PHA
         LDY   #$01
         LDA   (zp3C),Y
         ROR
         PLA
         BCC   L7A27
         ASL
         JSR   L7A27
         LSR   $0478
         RTS

L7A27    STA   $2E
         JSR   L7A4A
         LDA   $0478,Y
         BIT   $35
         BMI   L7A36
         LDA   $04F8,Y
L7A36    STA   $0478
         LDA   $2E
         BIT   $35
         BMI   L7A44
         STA   $04F8,Y
         BPL   L7A47
L7A44    STA   $0478,Y
L7A47    JMP   L7821

L7A4A    TXA
         LSR
         LSR
         LSR
         LSR
         TAY
         RTS

L7A51    PHA
         LDY   #$02
         LDA   (zp3A),Y
         ROR
         ROR   $35
         JSR   L7A4A
         PLA
         ASL
         BIT   $35
         BMI   L7A67
         STA   $04F8,Y
         BPL   L7A6A
L7A67    STA   $0478,Y
L7A6A    RTS
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: 2886
Localisation: Le Chesnay, France

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

My copy program: original in drive 1, copy in drive 2

Code:

*
* Bill Budge's Space Album
* (c) 1980, California Pacific
* (k) 2016, LoGo
*

* A way to read/write data
* Source is slot 6, drive 1
* Target is slot 6, drive 2
* Track loaded at $3000..$3CFF

         mx    %11
         org   $2000
         lst   off

*--- Equates

lastTRACK =    $0c        ; Copy II plus shows that

ptrRAM   =     $3000
rwtsREAD =     $7900
rwtsWRITE =    $bd00

*--- Code

         jsr   initALL
]lp      jsr   readTRACK
         jsr   writeTRACK

         lda   iobRTRACK
         cmp   #lastTRACK ; last track
         bne   ]lp
         rts

*---

initALL  lda   #1
         sta   iobRTRACK
         sta   iobWTRACK
         lda   #0
         sta   iobRSECTOR
         sta   iobWSECTOR
         rts

*---

readTRACK lda  #0
         sta   iobRSECTOR
         lda   #>ptrRAM
         sta   iobRRAM+1

]lp      lda   #>iobREAD
         ldy   #<iobREAD
         jsr   rwtsREAD

         ldy   iobRSECTOR
         iny
         cpy   #$0d
         bne   readTRACK1
         inc   iobRTRACK
         rts
readTRACK1 sty iobRSECTOR
         inc   iobRRAM+1
         bne   ]lp
         brk   $bd        ; if we're here...

*---

writeTRACK lda #0
         sta   iobWSECTOR
         lda   #>ptrRAM
         sta   iobWRAM+1

]lp      lda   #>iobWRITE
         ldy   #<iobWRITE
         jsr   rwtsWRITE

         ldy   iobWSECTOR
         iny
         cpy   #$0d
         bne   writeTRACK1
         inc   iobWTRACK
         rts
writeTRACK1 sty iobWSECTOR
         inc   iobWRAM+1
         bne   ]lp
         brk   $be        ; if we're here...

*--- IOB table for read

iobREAD  DB    $01        ; 00
         DB    $60        ; 01 slot*16 (was $70)
         DB    $01        ; 02 drive
         DB    $00        ; 03 volume
iobRSECTOR DB  $00        ; 04 sector (dft is track)
iobRTRACK DB   $01        ; 05 track (dft is sector)
         DA    L76F9      ; 06
iobRRAM  DA    ptrRAM     ; 08 address
         DB    $00        ; 0A
         DB    $00        ; 0B
         DB    $01        ; 0C (was $00)
         DB    $00        ; 0D
         DB    $00        ; 0E
         DB    $60        ; 0F (was $70)
         DB    $01        ; 10
L76F9    HEX   0001EFD8   ; 11

*--- IOB table for write

iobWRITE DB    $01        ; 00
         DB    $60        ; 01 slot*16
         DB    $02        ; 02 drive
         DB    $00        ; 03 volume
iobWTRACK DB   $01        ; 04 track
iobWSECTOR DB  $00        ; 05 sector
         DA    L76F9      ; 06
iobWRAM  DA    ptrRAM     ; 08 address
         DB    $00        ; 0A
         DB    $00        ; 0B
         DB    $02        ; 0C
         DB    $00        ; 0D
         DB    $00        ; 0E
         DB    $60        ; 0F
         DB    $01        ; 10
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