Index du Forum
IDENTIFICATION SERVEUR : 10.14.20.82 - CLIENT : 34.201.9.19

 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 

Lemmings (Sirius Software, 1982)

 
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Jeu 19 Nov 2015, 16:04    Sujet du message: Lemmings (Sirius Software, 1982) Répondre en citant

This is an arcade game of Sirius, not the one from DMA designs (ported to the IIgs by Brutal Deluxe Software).

Disk structure
This is a 4*4 disk format with 13 sectors per track.
The game loads fast, displays the title and then loads data from two other tracks.

Boot trace
We'll have to get the first sector. After analysis it, we see that four other sectors are loaded from $0400 to $07FF. We also have to get it but from a different address (this is the text screen here). From the monitor:
Code:

9600<C600.C6FFM
96FB:A9 14 8D 82F A9 18 8D 859 A9 59 8D 86D A9 FF 8D 86E A9 01 4C 801
9600G

We have our pseudo RWTS at $1400..$17FF. A further message will show its disassembly.

We now have to get the game in memory. We'll slightly change our code to patch the boot1 code, tell it to jump to $0280 which will patch the code to tell it jump at $0298 where we will save the zero page. Zero page is important in Sirius products, I've seen other games check values and reboot if not the right ones.

Code:

* Tell the boot1 code to go to our patch
96FB:A9 80 8D 86D A9 02 8D 86E A9 01 4C 801
* Tell the loader to jump to $0298
280:A9 2C 8D 464 A9 98 8D 4CB A9 02 8D 4CC 4C 41F
* Code to move the zero page to $B600 and go to monitor
298:A2 00 BD 0000 9D B600 CA D0 F7 4C FF59


Now, we have the "nearly" entire program in memory. If everything is loaded correctly, the boot loader jumps at $157A.

We'll have to rewrite the boot code, the pseudo RWTS. It will be described in a following message.

The code at $4000..$4BFF is moved to $B400..$BFFF and then two calls to $BF4A and $BF3D are done. The phase is stored in zero page $57 and a reference value (higher than the first one) is stored at $0437. Then a call $0400 is done.
- $BF3D loads data from phase 6, at $2000
- $BF4A loads data from phase C at $4000
Both are called at the beginning of the game and add a tiny sprite in the upper left corner of the HGR screen. If you patch the calls, nothing "bad" happens, you can play.

So, v1 of the crack will load everything but the tiny sprite and v2 will load all of the game and its tiny sprite.

Both versions can be found at http://www.brutaldeluxe.fr/crack/

Reboot and... enjoy,

LoGo
11/2015


Derničre édition par toinet le Jeu 19 Nov 2015, 16:11; é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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Jeu 19 Nov 2015, 16:05    Sujet du message: Répondre en citant

This is the original boot1 code at $0800

Code:

*
* Lemmings
* (c) 1981, Sirius Software
* (k) 2015, LoGo
*

         mx    %11
         org   $0800
         lst   off

*----------

TXTCLR   EQU   $C050
MIXCLR   EQU   $C052
TXTPAGE2 EQU   $C055
HIRES    EQU   $C057
ROMIN2   EQU   $C081

*----------

L0800    DB    $01        ; load one sector

         LDA   MIXCLR     ; HGR on
         LDA   HIRES
         LDA   TXTPAGE2
         LDA   TXTCLR

*--- Clear ROM

         LDA   ROMIN2
         LDA   ROMIN2
         LDY   #$00
         STY   $00
         LDA   #$D0
         STA   $01
         LDX   #$30
L081D    LDA   ($00),Y
         STA   ($00),Y
         INY
         BNE   L081D
         INC   $01
         DEX
         BNE   L081D

*--- Load sectors

         LDX   $2B
         LDA   $C089,X
         LDA   #$04       ; At $0400
         STA   $01
L0832    LDA   $C08C,X
         BPL   L0832
L0837    CMP   #$DD
         BNE   L0832
L083B    LDA   $C08C,X
         BPL   L083B
         CMP   #$AD
         BNE   L0837
L0844    LDA   $C08C,X
         BPL   L0844
         CMP   #$DA
         BNE   L0837
L084D    LDA   $C08C,X
         BPL   L084D
         SEC
         ROL
         STA   $02

         LDA   $01        ; Did we reach $08?
         CMP   #$08
         BEQ   L086C

L085C    LDA   $C08C,X
         BPL   L085C
         AND   $02        ; Save 4*4 encoded nibbles
         STA   ($00),Y
         INY
         BNE   L084D
         INC   $01
         BNE   L084D

L086C    JMP   $041F      ; Jump to next stage

         HEX   D2A6AD5DB6F008EEBDB5D003EEBEB5A9
         HEX   008D5DB64C46A58DBCB520A8A620EAA2
         HEX   4C7DA2A013B142D014C8C017D0F7A019
         HEX   B14299A4B5C8C01DD0F64CBCA6A2FF8E
         HEX   5DB6D0F6000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   002058FCA9C220EDFDA90120DAFDA9AD
         HEX   20EDFDA90020DAFD6000000000000000
         HEX   000000000000000000000000000000B6
         HEX   09
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Jeu 19 Nov 2015, 16:05    Sujet du message: Répondre en citant

This is the original pseudo RWTS code at $0400..$07FF

Code:

*
* Lemmings
* (c) 1981, Sirius Software
* (k) 2015, LoGo
*

         mx    %11
         org   $0400
         lst   off

*----------

SOFTEV   EQU   $03F2
PWREDUP  EQU   $03F4
NMILOC   EQU   $03FB
IRQLOC   EQU   $03FE
SPKR     EQU   $C030
TXTCLR   EQU   $C050
HIRES    EQU   $C057

L0400    NOP
         NOP
         LDX   $34
         LDA   $C08A,X
         LDA   $C089,X
         LDY   #$64
L040C    LDA   #$64
         JSR   L0788
         DEY
         BNE   L040C
         LDX   $34
         LDA   $C08E,X
         NOP
         NOP
         NOP
         JMP   L0451

*--- Entry point

L041F    JSR   L07E5      ; Fill ZP
         NOP
         NOP
         LDA   #$00
         STA   $26
         NOP
         NOP
         JMP   L07CD      ; Clear RAM

L042D    HEX   EBEFBFBEAAFEABBF

         DB    $45
         DB    $00

L0437    DB    $FF

*--- Step 3

L0438    LDA   #$02
         STA   $57

         LDA   #$00       ; Calculate checksum
         LDY   #$00
L0440    EOR   L0400,Y
         EOR   L0400+$0100,Y
         EOR   L0400+$0200,Y
         EOR   L0400+$0300,Y
         INY
         BNE   L0440
         STA   $2C        ; We store a checksum here

L0451    LDA   $34        ; Slot*16
         LSR
         LSR
         LSR
         LSR
         CLC
         ADC   #$C0       ; $32..$33: $C600
         STA   $33
         LDA   #$00
         STA   $32
         LDA   $2C        ; Get our checksum
L0462    BEQ   L0467      ; branch if 0
         JMP   ($0032)    ; or reboot

L0467    LDA   #$90       ; Put a BCC
         STA   L0462

         LDA   $32        ; Set reboot pointer
         STA   IRQLOC
         STA   $03F0
         STA   SOFTEV
         STA   NMILOC+1
         LDA   $33
         STA   IRQLOC+1
         STA   SOFTEV+1
         STA   NMILOC+2
         STA   $03F1
         EOR   #$A5
         STA   PWREDUP

         LDA   #$4C       ; JUMP
         STA   $03EF
         STA   NMILOC

         LDA   $EA        ; Should have 5A?
         STA   $2B

         LDA   #$00
         STA   $39
         LDA   #$FC       ; Store FC
         STA   $EA
         LDA   #$01
         STA   $44
         LDA   #$00
         LDA   $26
         NOP
         NOP
         NOP
L04AC    LDA   #$08
         STA   $43
L04B0    LDA   #$00
         STA   $2F
         LDA   $57        ; default is 02
         CMP   L0437      ; default is FF
         BCC   L04C3
         LDA   $C088,X
         LDA   $2B
         STA   $EA
         RTS

L04C3    LSR              ; Get RAM pointer
         TAY
         LDA   L07AB-1,Y
         BNE   L04CD
         JMP   L06FF      ; Play the game...

L04CD    STA   $30        ; Start RAM
         CLC
         ADC   #$0C       ; End RAM
         STA   $37
         TYA
         AND   #$0F
         TAY
         LDA   L07BD,Y    ; Marker
         STA   $45

         LDA   $57
         LDX   $34
         JSR   L072D
         LDA   $37
         STA   $3E
         SEC
         LDA   $2F
         SBC   #$08
         STA   $2F
         LDA   $30
         SBC   #$00
         STA   $30
         LDA   #$00       ; the checksum
         STA   $3A
         STA   $41
         STA   $3D
         LDA   TXTCLR

L0500    LDA   #$FC
         STA   $EA
         LDY   #$00
L0506    LDA   $C08C,X
         BPL   L0506
         CMP   L042D,Y    ; Marker?
         BEQ   L0517
         LDY   #$00
         CMP   L042D,Y
         BNE   L0506
L0517    INY
         CPY   #$08
         BCC   L0506
L051C    LDA   $C08C,X
         BPL   L051C
         CMP   $45        ; Marker
         BNE   L0562
L0525    LDA   $C08C,X
         BPL   L0525
         SEC
         ROL
         STA   $3F
L052E    LDA   $C08C,X
         BPL   L052E
         AND   $3F
         STA   $42        ; 4*4 nibble

         JSR   L059F      ; Read

         LDA   TXTCLR
         LDA   HIRES
         LDX   $34        ; Check
         LDA   #$71
         LDA   L07FE
         LDA   #$00
         EOR   #$21
         EOR   L07FD
         LDA   $41
         CMP   $42
         BEQ   L0581      ; Read is OK
         LDA   #$14
         JSR   L0588      ; Beep
         DEC   $43
         BPL   L057E
         LDA   #$3C
         JSR   L0588      ; Beep
L0562    LDA   #$06
         STA   $43
         DEC   $44
         BMI   L0576
         LDA   #$5A
         STA   $26
         LDA   #$00
         JSR   L072D      ; Move to track 0
         JMP   L04B0      ; And load...

*--- Beep and reboot

L0576    LDA   #$FF       ; Beep
         JSR   L0588
         JMP   ($0032)    ; Reboot

L057E    JMP   L04B0

L0581    INC   $57        ; Next phase
         INC   $57
         JMP   L04AC      ; Loop

*---

L0588    LDX   #$10       ; Beep
L058A    TAY
L058B    DEY
         PHP
         PLP
         PHP
         PLP
         BNE   L058B
         BIT   SPKR
         DEX
         BNE   L058A
         LDX   $34
         RTS

         NOP
L059C    JMP   L06F5

*--- Read data

L059F    LDA   $C08C,X
         BMI   L05C2
         LDA   $C08C,X
         BMI   L05C2
         LDA   $C08C,X
         BMI   L05C2
         LDA   $C08C,X
         BMI   L05C2
         LDA   $C08C,X
         BMI   L05C2
         LDA   $C08C,X
         BMI   L05C2
         LDA   $C08C,X
         BMI   L05C2

L05C2    ROL
         STA   $3F
         LDA   $2F
         ADC   #$07
         STA   $2F
         LDA   $30
         ADC   $39
         STA   $30
         LDA   $C08C,X
         BMI   L05D9+1    ;
         LDA   $C08C,X
L05D9    INC   $EA        ; HEX E6 HEX EA
         AND   $3F
         LDY   #$00
         EOR   $3A
         STA   ($2F),Y
         ADC   $41
         STA   $41
         LDA   $C08C,X
         BMI   L05EF+1
         LDA   $C08C,X
L05EF    INC   $EA        ; HEX E6 NOP
         SEC
         ROL
         STA   $3F
         CLC
         LDA   $30
         ORA   $39
         CMP   $3E
         BEQ   L059C
L05FE    LDA   $C08C,X
         BMI   L0606+1
         LDA   $C08C,X
L0606    INC   $EA        ;
         AND   $3F
         LDY   #$01
         EOR   $3A
         STA   ($2F),Y
         ADC   $41
         STA   $41
         LDA   $C08C,X
         BMI   L061C+1
         LDA   $C08C,X
L061C    INC   $EA
         SEC
         ROL
         STA   $3F
         CLC
         EOR   $3B
         STA   $3B
         INC   $3C
         LDA   $C08C,X
         BMI   L0631+1
         LDA   $C08C,X
L0631    INC   $EA
         AND   $3F
         LDY   #$02
         EOR   $3A
         STA   ($2F),Y
         ADC   $41
         STA   $41
         LDA   $C08C,X
         BMI   L0647+1
         LDA   $C08C,X
L0647    INC   $EA
         SEC
         ROL
         STA   $3F
         LDA   $30
         CMP   $3E
         BEQ   L069C
         INC   $3C
         LDA   $C08C,X
         BMI   L0661
L065A    LDA   $C08C,X
         BPL   L065A
         INC   $EA
L0661    AND   $3F
         LDY   #$03
         EOR   $3A
         STA   ($2F),Y
         STA   $25
L066B    LDA   $C08C,X
         BPL   L066B
         ROL   $EA
         ROL   $3A
         SEC
         ROL
         STA   L067E+1
L0679    LDA   $C08C,X
         BPL   L0679
L067E    AND   #$00
         EOR   $3A
         LDY   #$04
         STA   ($2F),Y
         ADC   $25
         ADC   $41
         STA   $41
L068C    LDA   $C08C,X
         BPL   L068C
         SEC
         ROL
         STA   L06A4+1
         LDA   $C04C,Y
         JMP   L069F
L069C    JMP   L06F5

L069F    LDA   $C08C,X
         BPL   L069F
L06A4    AND   #$00
         EOR   $3A
         LDY   #$05
         STA   ($2F),Y
         CLC
         ADC   $41
         STA   $41
L06B1    LDA   $C08C,X
         BPL   L06B1
         SEC
         ROL
         STA   L06C6+1
         LDA   $3A
         ADC   $25
         STA   $3D
L06C1    LDA   $C08C,X
         BPL   L06C1
L06C6    AND   #$00
         EOR   $3A
         LDY   #$06
         STA   ($2F),Y
         CLC
         ADC   $41
         STA   $41
L06D3    LDA   $C08C,X
         BPL   L06D3
         SEC
         ROL
         STA   L06E6+1
         LDA   #$FC
         STA   $EA
L06E1    LDA   $C08C,X
         BPL   L06E1
L06E6    AND   #$00
         EOR   $3A
         LDY   #$07
         STA   ($2F),Y
         EOR   $41
         STA   $41
         JMP   L059F

L06F5    LDA   $41
         SEC
         SBC   ($2F),Y
         STA   $41
         LDA   ($2F),Y
         RTS

*--- The end...

L06FF    LDY   #$00       ; Turn drive off
         LDA   $C088,X
         LDA   #$00
         STA   $B400
         STA   $4C00

         STA   $2F        ; EOR all RAM
         LDA   #$08
         STA   $30
         LDA   #$00
         TAY
L0715    EOR   ($2F),Y
         INC   $2F
         BNE   L0715
         INC   $30
         LDX   $30
         CPX   #$C0
         BNE   L0715
         CMP   #$9F
         BEQ   L072A
         JMP   L0576

L072A    JMP   $157A      ; Entry point

*--- Move arm

L072D    STX   $2A
         STA   $27
         CMP   $26
         BEQ   L0784
         LDA   #$00
         STA   $29
L0739    LDA   $26
         STA   $28
         SEC
         SBC   $27
         BEQ   L0773
         BCS   L074A
         EOR   #$FF
         INC   $26
         BCC   L074E
L074A    ADC   #$FE
         DEC   $26
L074E    CMP   $29
         BCC   L0754
         LDA   $29
L0754    CMP   #$0C
         BCS   L0759
         TAY
L0759    SEC
         JSR   L0777
         LDA   L0793,Y
         JSR   L0788
         LDA   $28
         CLC
         JSR   L0779
         LDA   L079F,Y
         JSR   L0788
         INC   $29
         BNE   L0739
L0773    JSR   L0788
         CLC
L0777    LDA   $26
L0779    AND   #$03
         ROL
         ORA   $2A
         TAX
         LDA   $C080,X
         LDX   $2A
L0784    RTS

         TAX
         LDY   #$A0
L0788    LDX   #$13
L078A    DEX
         BNE   L078A
         SEC
         SBC   #$01
         BNE   L0788
         RTS

L0793    HEX   01302824201E1D1C1C1C1C1C
L079F    HEX   702C26221F1E1D1C1C1C1C1C

*--- Where to load in RAM
* The $B400..$BFFF area is free...

L07AB    HEX   0814202C34404C5440606C7884909CA8
         HEX   0000


*--- The associated marker

L07BD    HEX   AAABAEAFBABBBEBFEAEBEEEFFAFBFEFF

*--- Step 2

L07CD    LDX   #$B8       ; Clear $0800..$BFFF
         LDA   #$08
         STA   $30
         LDA   #$00
         TAY
         STA   $2F
L07D8    STA   ($2F),Y
         INY
         BNE   L07D8
         INC   $30
         DEX
         BNE   L07D8
         JMP   L0438      ; next step...

*--- Step 1

L07E5    LDY   #$00
         LDA   $C08E,X    ; Hum...
         LDA   #$5A       ; Fill ZP with 5A
L07EC    STA   |$0000,Y
         DEY
         BNE   L07EC
         STX   $34        ; slot*16
         RTS

         DB    $FF
         DB    $00
         DB    $00
         DB    $FF
         DB    $FF
         DB    $00
         DB    $00
         DB    $FF
L07FD    DB    $FF
L07FE    DB    $93
         DB    $00
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Jeu 19 Nov 2015, 16:06    Sujet du message: Répondre en citant

This is the original zero page area once program is loaded in memory (but the tiny sprite isn't)

Code:

*
* Lemmings
* (c) 1981, Sirius Software
* (k) 2015, LoGo
*

         mx    %11
         org   $0000
         lst   off

*---------- The zero page

L0000    HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5AB420202002605A235A5A00
* $30 must be $C0 - Was $B4 before last checksum
         HEX   C05A00C6605A5AB45A0059DA5A0EB4D5
         HEX   5A53530801AA5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A225A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5AFE5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Jeu 19 Nov 2015, 16:09    Sujet du message: Répondre en citant

For v1, this is the rewritten boot code at $B800..$B9FF.
At $BA00, I have the zero page area
At $BB00..$BEFF, I have the original pseudo RWTS

I wrote a pseudo fast read track routine, it does not handle read errors and use the denibblize table from the ROM controller at the $0300 area.

This version uses the 16 sectors from a standard disk. On track 1, we have data from $0800..$17FF, on track 2: $1800..$27FF, and so on...

Code:

*
* Lemmings
* (c) 1981, Sirius Software
* (k) 2015, LoGo
*

         mx    %11
         org   $b800
         lst   off

*----------
* We relocate
* We set some values
* We read
* We patch
* We run

*----------

TXTCLR   EQU   $C050
MIXCLR   EQU   $C052
TXTPAGE2 EQU   $C055
HIRES    EQU   $C057
ROMIN2   EQU   $C081

dpBUFFER =     $20
dpSLOT   =     $2B
dpNIBBLE =     $3C
dpSECTOR =     $3D
dpBYTE   =     $40
nbSEC    =     $41

L0300    =     $0300
L0356    =     $0356

*--- Entry point

         lda   MIXCLR     ; HGR on
         lda   HIRES
         lda   TXTPAGE2
         lda   TXTCLR

*--- Move original code

         ldx   #0
]lp      lda   LBB00,x
         sta   $0400,x
         lda   LBB00+$100,x
         sta   $0500,x
         lda   LBB00+$200,x
         sta   $0600,x
         lda   LBB00+$300,x
         sta   $0700,x
         inx
         bne   ]lp

*--- Some inits

         lda   #0
         sta   $26        ; current phase
         sta   $27        ; target phase
         sta   dpBUFFER   ; low pointer address
         lda   #2         ; next phase
         sta   $57

*---

         lda   #$08       ; Where to load
         sta   $10

readLOOP ldx   $2B        ; slot*16
         lda   $57        ; phase
         jsr   $072D      ; the move arm routine
         jsr   readTRACK  ; Read a track

         lda   $10        ; Next track
         clc
         adc   #$10
         sta   $10
         cmp   #$b8       ; until end of life
         beq   endREAD

         inc   $57        ; next track please
         inc   $57
         bne   readLOOP   ; loop

*--- We're done

endREAD  ldx   $2B
         ldy   #$00       ; Turn drive off
         lda   $C088,x
         lda   #$00
         sta   $B400
         sta   $4C00

*---

         ldx   #0         ; Move original zero page
]lp      lda   LBA00,x
         sta   |$0000,x
         inx
         bne   ]lp

         jmp   $157A      ; Jump to the game

         ds    \

*--- Our read routine

readTRACK ldy  #16-1
         sty   nbSEC      ; nb sectors to load
]lp      ldx   INTER,y    ; set RAM pointer
         tya
         clc
         adc   $10
         sta   memPTR,x
         lda   #0         ; tell sector not loaded
         sta   secMEM,y
         dey
         bpl   ]lp

         ldx   $2b        ; slot*16

* Read header

readHEADER CLC
readDATA PHP
read1    LDA   $C08C,X
         BPL   *-3
read2    EOR   #$D5
         BNE   read1
         LDA   $C08C,X
         BPL   *-3
         CMP   #$AA
         BNE   read2
         LDA   $C08C,X
         BPL   *-3
         CMP   #$96
         BEQ   doHEADER
         PLP
         BCC   readHEADER
         EOR   #$AD
         BEQ   doDATA
         BNE   readHEADER

* Read header

doHEADER LDY   #$03
]lp      STA   dpBYTE
         LDA   $C08C,X
         BPL   *-3
         ROL
         STA   dpNIBBLE
         LDA   $C08C,X
         BPL   *-3
         AND   dpNIBBLE
         DEY
         BNE   ]lp
         PLP

         tay
         lda   secMEM,y   ; is sector loaded?
         bne   readHEADER ; yes, want next
         lda   #-1
         sta   secMEM,y   ; no, then say load it
         lda   memPTR,y   ; tell where to load
         sta   dpBUFFER+1

         sec
         bcs   readDATA

* Read data

doDATA   LDY   #$56
]lp      STY   dpNIBBLE
         LDY   $C08C,X
         BPL   *-3
         EOR   L0356-$80,Y
         LDY   dpNIBBLE
         DEY
         STA   L0300,Y
         BNE   ]lp

]lp      STY   dpNIBBLE
         LDY   $C08C,X
         BPL   *-3
         EOR   L0356-$80,Y
         LDY   dpNIBBLE
         STA   (dpBUFFER),Y
         INY
         BNE   ]lp

         LDY   $C08C,X    ; checksum
         BPL   *-3
         EOR   L0356-$80,Y
         BNE   readHEADER

* Deniblize

         LDY   #$00
doNIBBLE1 LDX  #$56
doNIBBLE2 DEX
         BMI   doNIBBLE1
         LDA   (dpBUFFER),Y
         LSR   L0356-$56,X
         ROL
         LSR   L0356-$56,X
         ROL
         STA   (dpBUFFER),Y
         INY
         BNE   doNIBBLE2

* Next sector

         ldx   $2B

         dec   nbSEC      ; sector--
         bmi   readEND
         jmp   readHEADER ; loop if not finished
readEND  rts              ; or return

*--- Our tables

INTER    hex   000D0B0907050301
         hex   0E0C0A080604020F

memPTR   ds    16         ; Where to load sectors
secMEM   ds    16         ; Tell if sector loaded or not?

         ds    \

*---

LBA00    ds    256        ; the zero page
LBB00    ds    256*4      ; the original RWTS
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Jeu 19 Nov 2015, 17:55    Sujet du message: Répondre en citant

In order to prepare v2 of the crack, we have to know what is loaded where:

Code:

TR PH RAM
 1 02 0800
 2 04 1400
 3 06 2000 <- is reloaded
 4 08 2C00
 5 0A 3400
 6 0C 4000 <- is reloaded
 7 0E 4C00
 8 10 5400
 9 12 4000 <- moved at $B400
 A 14 6000
 B 16 6C00
 C 18 7800
 D 1A 8400
 E 1C 9000
 F 1E 9C00
10 20 A800


One option would be to replace 40 for track 6 and put B4. The $4000..$4BFF area is moved to $B400..$BFFF. Our loader at $B800 would need to be rewritten and moved at $0400.

v2 will be a finished crack because the game reloads data after a game is over. With the current version of the crack, the game will not reload data, the HGR screen is not correctly refreshed tough it does not prevent you from playing.

The data loaded at $4000 by $BF4A displays a HGR screen with a "BUY A BORG" sign held by a lemming. Nice!
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: 176

MessagePosté le: Jeu 19 Nov 2015, 18:55    Sujet du message: Répondre en citant

too bad that you didn't find a use for my fast RWTS routine so that you didn't have to make your own. :-)
Nice work.
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Jeu 19 Nov 2015, 19:30    Sujet du message: Répondre en citant

qkumba a écrit:
too bad that you didn't find a use for my fast RWTS routine so that you didn't have to make your own. Smile
Nice work.


I'm done reordering the disk for v2. I'll have a look at your fast RWTS routine.
Thanks!
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Ven 20 Nov 2015, 12:44    Sujet du message: Répondre en citant

As Qkumba's fast RWTS is similar to mine, I'll go with mine.

Here is the rewritten boot1 sector, the one on track 0 / sector 0. It loads 4 sectors, moves them to the text screen area and jumps to $041F.

Code:

*
* Lemmings
* (c) 1981, Sirius Software
* (k) 2015, LoGo
*

         mx    %11
         org   $0800
         lst   off

*----------

TXTCLR   EQU   $C050
MIXCLR   EQU   $C052
TXTPAGE2 EQU   $C055
HIRES    EQU   $C057
INIT     EQU   $FB2F
SETKBD   EQU   $FE89
SETVID   EQU   $FE93

*---------- The new T0/S0 sector

L0800    DB    $01

         LDA   $27
         CMP   #$09
         BNE   L081F
         LDA   $2B
         LSR
         LSR
         LSR
         LSR
         ORA   #$C0
         STA   $3F
         LDA   #$5C
         STA   $3E
         CLC
         LDA   L08FE
         ADC   L08FF
         STA   L08FE
L081F    LDX   L08FF
         BMI   L0839
         LDA   INTER,X
         STA   $3D
         DEC   L08FF
         LDA   L08FE
         STA   $27
         DEC   L08FE
         LDX   $2B
         JMP   ($003E)

L0839    INC   L08FE
         INC   L08FE
         JSR   SETKBD
         JSR   SETVID
         JSR   INIT
         LDA   TXTCLR
         LDA   MIXCLR
         LDA   TXTPAGE2
         LDA   HIRES

         LDX   #$00       ; move 4 pages
]lp      LDA   $B800,X    ; to the text
         STA   $0400,X    ; screen area
         LDA   $B900,X
         STA   $0500,X
         LDA   $BA00,X
         STA   $0600,X
         LDA   $BB00,X
         STA   $0700,X
         DEX
         BNE   ]lp

         LDX   $2B        ; get the slot*16
         JMP   $041F      ; and jump!

         DB    $00
         DB    $00

INTER    HEX   000D0B09070503010E0C0A080604020F

         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000000000000

L08FE    DB    $B7        ; start to load at $B700
L08FF    DB    $04        ; load 4+1 sectors!
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Ven 20 Nov 2015, 12:46    Sujet du message: Répondre en citant

And the rewritten original RWTS. The main load routines are at $0400, the move arm routine at $0500, the pseudo-fast-RWTS at $600 and the original zero page at $0700.

Now, the game can load the tracks when needed. Yeepee Wink
Find the v2 at http://www.brutaldeluxe.fr/crack/

Enjoy and... reboot,
LoGo
11/2015

Code:

*
* Lemmings
* (c) 1981, Sirius Software
* (k) 2015, LoGo
*

         mx    %11
         org   $0400
         lst   off

*----------

SOFTEV   EQU   $03F2
PWREDUP  EQU   $03F4
NMILOC   EQU   $03FB
IRQLOC   EQU   $03FE
SPKR     EQU   $C030
TXTCLR   EQU   $C050
TXTPAGE2 EQU   $C055
HIRES    EQU   $C057
ROMIN2   EQU   $C081

SPT      =     12         ; nb of sectors per track
                          ; put 16 for a 16-sec disk

dpNIBBLE =     $10        ; to be saved
dpRAM    =     $2f
dpSLOT   =     $34
dpINDEX  =     $57

L0300    =     $0300
L0356    =     $0356

*---------- Entry point during the game

L0400    NOP
         NOP
         LDX   dpSLOT
         LDA   $C08A,X
         LDA   $C089,X
         LDY   #$64
L040C    LDA   #$64
         JSR   L0788      ; wait
         DEY
         BNE   L040C
         LDX   dpSLOT
         LDA   $C08E,X
         NOP
         NOP
         NOP
         JMP   L0451

*--- Entry point: $041F

L041F    ldy   #$00       ; Put zero page
]lp      lda   L0000,y
         sta   |$0000,Y
         dey
         bne   ]lp

         stx   dpSLOT     ; slot*16

         lda   #$00
         sta   $26
         sta   $2c        ; checksum

         jmp   nextSTEP

         nop
         nop

*--- Must be at $0437

L0437    DB    $FF        ; Must be kept!

*--- Step 2

nextSTEP LDX   #$B8       ; Clear $0800..$BFFF
         LDA   #$08
         STA   dpRAM+1
         LDA   #$00
         TAY
         STA   dpRAM
]lp      STA   (dpRAM),Y
         INY
         BNE   ]lp
         INC   dpRAM+1
         DEX
         BNE   ]lp

*--- Step 3

L0438    LDA   #$02
         STA   dpINDEX

*--- Common entry point

         LDA   dpSLOT     ; Slot*16
         LSR
         LSR
         LSR
         LSR
         CLC
         ADC   #$C0       ; $32..$33: $C600
         STA   $33
         LDA   #$00
         STA   $32

         LDA   $32        ; Set reboot pointer
         STA   IRQLOC
         STA   $03F0
         STA   SOFTEV
         STA   NMILOC+1
         LDA   $33
         STA   IRQLOC+1
         STA   SOFTEV+1
         STA   NMILOC+2
         STA   $03F1
         EOR   #$A5
         STA   PWREDUP

         LDA   #$4C       ; JUMP
         STA   $03EF
         STA   NMILOC

*--- New common entry point

L0451    LDA   $EA        ; Should have 5A?
         STA   $2B

         lda   dpNIBBLE   ; save value
         sta   theNIBBLE

         LDA   #$00
         STA   dpRAM

         ldx   dpSLOT     ; we must have it!

L04AC    LDA   dpINDEX    ; default is 02
         CMP   L0437      ; default is FF
         BCC   L04C3
         LDA   $C088,X
         LDA   $2B
         STA   $EA

         lda   theNIBBLE  ; restore
         sta   dpNIBBLE
         rts              ; return

L04C3    LSR              ; Get RAM pointer
         TAY
         LDA   L07AB-1,Y
         BNE   L04CD
         JMP   L06FF      ; Play the game...

L04CD    STA   dpRAM+1    ; Start RAM

         ldy   #SPT-1     ; nb of sec to load
         sty   nbSEC

         ldy   #16-1      ; loop on 16-sec...
]lp      ldx   INTER,y    ; set RAM pointers
         tya
         clc
         adc   dpRAM+1
         sta   memPTR,x
         lda   secMEMREF,y
         sta   secMEM,y   ; sectors not to load
         dey
         bpl   ]lp

         lda   dpINDEX    ; the track to load
         ldx   dpSLOT     ; the slot where to load
         jsr   moveARM    ; move arm
         jsr   readTRACK  ; read track

         inc   dpINDEX    ; Next phase
         inc   dpINDEX
         jmp   L04AC      ; Loop

*--- The end...

L06FF    ldy   #$00       ; Turn drive off
         lda   $c088,x
         lda   #$00
         sta   $B400
         sta   $4C00
         sta   dpRAM
         ldx   #$c0
         stx   dpRAM+1

         lda   theNIBBLE  ; restore
         sta   dpNIBBLE

         jmp   $157A      ; Entry point

         ds    \

*--- Move arm

moveARM  STX   $2A
         STA   $27
         CMP   $26
         BEQ   L0784
         LDA   #$00
         STA   $29
L0739    LDA   $26
         STA   $28
         SEC
         SBC   $27
         BEQ   L0773
         BCS   L074A
         EOR   #$FF
         INC   $26
         BCC   L074E
L074A    ADC   #$FE
         DEC   $26
L074E    CMP   $29
         BCC   L0754
         LDA   $29
L0754    CMP   #$0C
         BCS   L0759
         TAY
L0759    SEC
         JSR   L0777
         LDA   L0793,Y
         JSR   L0788
         LDA   $28
         CLC
         JSR   L0779
         LDA   L079F,Y
         JSR   L0788
         INC   $29
         BNE   L0739
L0773    JSR   L0788
         CLC
L0777    LDA   $26
L0779    AND   #$03
         ROL
         ORA   $2A
         TAX
         LDA   $C080,X
         LDX   $2A
L0784    RTS

L0788    LDX   #$13
L078A    DEX
         BNE   L078A
         SEC
         SBC   #$01
         BNE   L0788
         RTS

L0793    HEX   01302824201E1D1C1C1C1C1C
L079F    HEX   702C26221F1E1D1C1C1C1C1C

*--- Where to load in RAM

L07AB    HEX   0814202C34404C5440606C7884909CA8
         HEX   0000

         ds    \

*--- Our read routine

readTRACK ldx  dpSLOT     ; slot*16

* Read header

readHEADER CLC
readDATA PHP
read1    LDA   $C08C,X
         BPL   *-3
read2    EOR   #$D5
         BNE   read1
         LDA   $C08C,X
         BPL   *-3
         CMP   #$AA
         BNE   read2
         LDA   $C08C,X
         BPL   *-3
         CMP   #$96
         BEQ   doHEADER
         PLP
         BCC   readHEADER
         EOR   #$AD
         BEQ   doDATA
         BNE   readHEADER

* Read header

doHEADER LDY   #$03
]lp      LDA   $C08C,X
         BPL   *-3
         ROL
         STA   dpNIBBLE
         LDA   $C08C,X
         BPL   *-3
         AND   dpNIBBLE
         DEY
         BNE   ]lp
         PLP

         tay
         lda   secMEM,y   ; is sector loaded?
         bne   readHEADER ; yes, want next
         lda   #-1
         sta   secMEM,y   ; no, then say load it
         lda   memPTR,y   ; tell where to load
         sta   dpRAM+1

         sec
         bcs   readDATA

* Read data

doDATA   LDY   #$56
]lp      STY   dpNIBBLE
         LDY   $C08C,X
         BPL   *-3
         EOR   L0356-$80,Y
         LDY   dpNIBBLE
         DEY
         STA   L0300,Y
         BNE   ]lp

]lp      STY   dpNIBBLE
         LDY   $C08C,X
         BPL   *-3
         EOR   L0356-$80,Y
         LDY   dpNIBBLE
         STA   (dpRAM),Y
         INY
         BNE   ]lp

         LDY   $C08C,X    ; checksum
         BPL   *-3
         EOR   L0356-$80,Y
         BNE   readHEADER

* Deniblize

         LDY   #$00
doNIBBLE1 LDX  #$56
doNIBBLE2 DEX
         BMI   doNIBBLE1
         LDA   (dpRAM),Y
         LSR   L0356-$56,X
         ROL
         LSR   L0356-$56,X
         ROL
         STA   (dpRAM),Y
         INY
         BNE   doNIBBLE2

* Next sector

         ldx   dpSLOT

         dec   nbSEC      ; sector--
         bmi   readEND
         jmp   readHEADER ; loop if not finished
readEND  rts              ; or return

*--- Our tables

nbSEC    ds    1
theNIBBLE ds   1

INTER    hex   000D0B0907050301
         hex   0E0C0A080604020F

memPTR   ds    16         ; Where to load sectors
secMEM   ds    16         ; Tell if sector loaded or not?

secMEMREF hex  0000FF00FF00FF00
         hex   00000000000000FF

         ds    \

*---------- The zero page

L0000    HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5AB420202002605A235A5A00
* $30 must be $C0 - Was $B4
         HEX   C05A00C6605A5AB45A0059DA5A0EB4D5
         HEX   5A53530801AA5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A225A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5AFE5A5A5A5A5A
         HEX   5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A5A
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