Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.129 - CLIENT : 54.160.245.121

 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 

Rastan (Taito, 1990)
Aller ŕ la page 1, 2  Suivante
 
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: 2895
Localisation: Le Chesnay, France

MessagePosté le: Dim 31 Mai 2015, 22:05    Sujet du message: Rastan (Taito, 1990) Répondre en citant

Be the invincible ancient warlord... In a mythical land of death and aventures, survival is always a breath away. Slay deadly dragons. Capture life-giving magical power signs and conquer the mighty Castle King. Be sure. Be swift. Be brave. You have the power to triumph... use it well.

PROTECTION TYPE
The two original 3.5" disks can be copied without an issue. Nevertheless, when you boot your copy, the game starts to load and then keeps on asking you to "PLEASE INSERT DISK B AND PRESS A KEY".

When a diskette can be copied but fails to work properly, that is because some hidden nibbles were not copied from the original onto the copy.

THE BOOT PROCESS
This is a standard ProDOS 8 diskette, the boot1 loads the ProDOS system file which then loads RASTAN.SYSTEM which is executed at $2000.

Once that is done, the game is loaded onto memory and at $21B1, there is the final jump to $02/0000, the entry point of the game.

We cannot interrupt the program because the control panel is not accessible. Second problem: all files are compressed on the disk and are uncompressed when loaded. We have to interrupt the program before it jumps to $02/0000.

So... we redirect the final jump to an interesting entry point, the cold boot one, at $FE/0000.
- Launch Disk.Fixer
- Prefix /RASTANA
- Follow RASTAN.SYSTEM
- At offset $1B1, replace 5C 00 00 02 with 5C 00 00 FE
- Save the block back onto disk
- Reboot...

The program is loaded in memory and then stops. Press OpenApple-Control-Esc... You are in the control panel, select Visit monitor!

The first step is done!

WHERE IN MEMORY IS?
We know that Rastan displays a message if the protection fails to execute. So, where in memory are the calls to the "PLEASE INSERT DISK B" code? We enter:
Code:

*00/
*\"DISK B"\<2000.5FFFP

The answer is at $2CB7
We scroll back and find the entry point of the routine at $2C07.

Now, we need to find where there are long calls to $2C07 (a long call because the routine ends with a RTL, not a RTS, so it is called from another bank)

We'll try with banks 2 and 3 where the code of the game relies.
Code:

*\22 07 2C 00\<02/0000.FFFFP

Answers are: 1FE4, 2009, 2048, 2356, 236B
There are no answers for bank 3.

We disassemble the code starting at $1F00 and see if we find weird things. The SEI (stop interrupts) at $1FEA is, the code that follows also because there are two calls to $00/58A3 and $00/5995 and when one looks at such addresses, there is no code. That means that the protection is hidden in memory.

We try to locate calls to $C0E9 (turn drive on) but we find none. See in the CALLPROT.S source code the listing of that part. The data at $03/3A58 is uncompressed at $00/5800 and then executed at $58A3 and $5995.

THE PROTECTION CODE
We want to have the decyphered code of the protection. Let's fake the program and decompress it:
Code:

*02/
*2000:6B
*<control-n)
*1FEBX


Now, look at the code at $5800 until $5DFF. You can find a lot of PER (read Eyes & Lichty's Programming the 65816, page 407, published by Brady to understand the opcode), you will also find $C0E9 calls and so on. We have our protection.

DEFEAT THE PROTECTION: APPROACH 1
You want to bypass the entire protection and replace
Code:
02/1FE2:90 06

with
Code:
02/1FE2:90 30


So, we'll patch the RASTAN.SYSTEM by adding some extra bytes. Reboot to BASIC.SYSTEM and then type in the following commands:
Code:
PREFIX /RASTAN
BLOAD RASTAN.SYSTEM,A$2000,TSYS
MTR
21B2:60 55 00
5560:A9 90 30 8F E2 1F 02 5C 00 00 02
BSAVE RASTAN.SYSTEM,A$2000,TSYS,E$556F

Reboot and... nothing! We need to do something else from a clean copy.

DEFEAT THE PROTECTION: APPROACH 2
First, apply the boot process chapter and come back here. Reboot and enter the monitor. We will execute the protection and see if we can defeat it. So, we'll consider that we have the code in memory. Also, apply the protection code chapter.

We'll now execute the protection code (for more information, refer to the PROTECTION.S source code). It is important to note that there is a direct page for the protection, it relies at $5800.
Code:
*<control-n>
*00/58A3X

If you look at $5995, you will see a protection check of direct page values from $01, $02, $03 and $04. If the sum is less than 14 then we have an original.
So, let's change the protection routine and keep the protection check.

So, we'll patch the RASTAN.SYSTEM by adding some extra bytes, those from the first bytes of the direct page. Reboot to BASIC.SYSTEM and then type in the following commands:
Code:
PREFIX /RASTAN
BLOAD RASTAN.SYSTEM,A$2000,TSYS
MTR
21B2:60 55 00
5560:A9 70 55 8F 01 20 02 5C 00 00 02
5570:A9 02 50 8F 04 58 00 A9 00 01 8F 02 58 00 A9 00 00 8F 00 58 00 18 6B
BSAVE RASTAN.SYSTEM,A$2000,TSYS,E$558F

Reboot and... play... The game loads... You can play... And, then a message is displayed:

Code:
Just say NO to piracy...
It's killing the GS market
DEAD


Interesting! That means that the program performs a checksum of the code.

DEFEAT THE PROTECTION: APPROACH 3
So, if we cannot change some data in the code, where can we do it? One approach we usually do is to intercept the OS calls. As we are running on ProDOS 8, we can redirect the calls to $BF00, the MLI interpreter entry point, to a new routine.

But we must find which files are called before activating the protection. See the CALLPROT.S source code for more information. The index of the files are at $2125. Indexes are $6E, $70, $72, $74 and $76 meaning the SHAPEDATA of the game.

As we saw that changing bytes in the code is not a correct option because Rastan is performing a checksum. Just like Brutal Deluxe did with LemminGS.

Here is what we will do: 00/21B1 -> 00/5560 (patch the MLI, reset 00/21B1) -> 00/5580 (check the file to load, patch the protection if matches) -> 00/55B0 (sets the final protection values, resets the patch)

All the new code is at $5560 on the file RASTAN.PATCH.S source code.

Now, let's try that:
Code:
PREFIX /RASTAN
BLOAD RASTAN.SYSTEM,A$2000,TSYS
MTR
21B2:60 55 00
BLOAD RASTAN.PATCH
BSAVE RASTAN.SYSTEM,A$2000,TSYS,E$55CF


Reboot and... enjoy!

All the source code files are under the CRACK folder of the RASTANA diskette. Download the files at http://www.brutaldeluxe.fr/crack/

LoGo
5/2015
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: 2895
Localisation: Le Chesnay, France

MessagePosté le: Dim 31 Mai 2015, 22:10    Sujet du message: Répondre en citant

This is the CALLPROT.S source code. Located in segment 2, it is that part of the code that calls the protection and checks the result values:

Code:

*
* Rastan
* (c) 1990, Taito
*
* This is part of the RASTAN1 file
* uncompressed in segment 2
*

         TYP   BIN
         ORG   $021FCE

         MX    %00

L1FCE    LDX   $2A2D      ; the level
         LDA   $2125,X
         AND   #$00FF
         TAY              ; index to file list
         LDX   #$0004     ; high address
         LDA   #$0000     ; low address
         JSL   $002474    ; load level data
         BCC   L1FEA
         JSL   $002C07    ; KO...INSERT DISKB
         BRA   L1FCE      ; and loop

* The call to the protection

L1FEA    SEI              ; start of protection
         LDA   #$0003     ; code is at $03/3A58
         STA   $7E
         LDA   #$3A58
         STA   $7C
         STZ   $82        ; unpack at $00/5800
         LDA   #$5800
         STA   $80
         JSL   $002B29    ; unpack

*--- We will patch this JSL...

L2000    JSL   $0058A3    ; check original (find disk...)
         BCC   L200F      ; OK
         LDA   #$0045
         JSL   $002C07    ; KO... INSERT DISKB
         BRA   L2000      ; loop

L200F    JSL   $005995    ; now, check the data read

*--- Normally, you return here...

         CLI
         LDAL  $E0C068
         ORA   #$0030
         STAL  $E0C068
         ...

*--- The index to the table of pointers to P8 filenames

L2125    HEX   6E6E706E6E726E6E746E6E76
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: 2895
Localisation: Le Chesnay, France

MessagePosté le: Dim 31 Mai 2015, 22:10    Sujet du message: Répondre en citant

This is the RASTAN.SYSTEM source code. The code at $2C07 is the one that asks for the insertion of DISK B in the drive.

Code:

*
* Rastan
* (c) 1990, Taito
*
* This is the RASTAN.SYSTEM file
*

         LST   OFF
         TYP   SYS
         ORG   $2000
         dsk   Rastan.System

         use   4/Misc.Macs
         use   4/Util.Macs

*---

PWREDUP  EQU   $03F4
PRODOS8  EQU   $BF00
DRIVERTBL1 EQU $BF10
DRIVERTBL2 EQU $BF20
NUMDEVS  EQU   $BF31
MACHID   EQU   $BF98
TBCOLOR  EQU   $C022
VGCINT   EQU   $C023
NEWVIDEO EQU   $C029
CLOCKCTL EQU   $C034
SHADOW   EQU   $C035
CYAREG   EQU   $C036
INTEN    EQU   $C041
STATEREG EQU   $C068
INIT     EQU   $FB2F
HOME     EQU   $FC58
SETKBD   EQU   $FE89
SETVID   EQU   $FE93

*---

         MX    %11

L2000    LDA   #$06
         STAL  $E0C035
         LDAL  $E0C083
         LDAL  $E0C083
         LDA   #$0C
         STAL  $E0C068
         LDA   TBCOLOR
         PHA
         STZ   TBCOLOR
         STZ   CLOCKCTL
         LDA   #$41
         TSB   NEWVIDEO
         LDA   #$80
         TRB   NEWVIDEO
         LDA   #$80
         TSB   CYAREG
         LDA   #$06
         TRB   VGCINT
         LDA   #$18
         TRB   INTEN
         JSR   SETKBD
         JSR   SETVID
         JSR   INIT
         JSR   HOME
         INC   PWREDUP
         LDX   #$17
         LDA   #$00
L204A    STA   $BF58,X
         DEX
         BPL   L204A
         PLA
         STA   TBCOLOR
         CLC
         XCE
         REP   #$30
         LDA   MACHID
         AND   #$0030
         CMP   #$0030
         BNE   L2098
         LDA   DRIVERTBL2+6
         CMP   DRIVERTBL1+6
         BEQ   L2098
         LDA   DRIVERTBL1+6
         STA   DRIVERTBL2+6
         SEP   #$30
         LDX   NUMDEVS
L2076    LDA   $BF32,X
         AND   #$70
         CMP   #$30
         BEQ   L208B
         DEX
         BPL   L2076
         BRA   L2096
L2084    LDA   $BF33,X
         STA   $BF32,X
         INX
L208B    CPX   NUMDEVS
         BNE   L2084
         DEC   NUMDEVS
         STZ   $BF32,X
L2096    REP   #$30
L2098    LDX   #$009C
L209B    LDAL  $E10002,X
         DEX
         DEX
         BMI   L20B6
         CMP   #$F000
         BCS   L209B
         JSL   $FE0000
         CLC
         XCE
         REP   #$30
         PHK
         PLB
         LDA   #$0000
         TCD
L20B6    LDY   #$0048
         LDX   #$0001
         LDA   #$2000
         JSL   L29AB
         BCC   L20C8
         JMP   L2D85

L20C8    SEP   #$20
         LDA   #$80
         TSB   NEWVIDEO
         LDA   #$18
         TSB   SHADOW
         REP   #$30
         LDA   #$0010
         JSR   L21EB
         LDX   #$0008
         BCS   L20E4
         JMP   L223E

L20E4    STZ   L5520
         LDA   #$0012
         JSR   L21EB
         BCC   L20F2
         DEC   L5520
L20F2    LDX   #$2000
         TXY
         LDA   #$7CFF
         MVN   $010000,$060000
         PHK
         PLB
         LDY   #$006C
         LDX   #$0004
         LDA   #$0000
         JSL   L29AB
         BCC   L2110
         JMP   L2D85

L2110    LDA   L5520
         BEQ   L2139
         LDY   #$0064
         LDX   #$0010
         LDA   #$0000
         JSL   L2474
         BCC   L2127
         JMP   L2D85

L2127    LDY   #$0066
         LDX   #$0011
         LDA   #$0000
         JSL   L29AB
         BCC   L2139
         JMP   L2D85

L2139    JSR   L2E6C
         LDY   #$004A
L213F    PHY
         LDX   L2187,Y    ; 21D1
         LDA   L216B,Y    ; 21B5
         BEQ   L2190
         BPL   L2173
         CMP   #$E000
         BCS   L2173
         STX   L2160+1
         XBA
         AND   #$007F
         TAX
         LDA   L216A,Y    ; 21B4
         AND   #$FF00
L215D    PHX
         PHA
         PHY
L2160    JSL   L29AB
         BCC   L216E
         JSR   L221C
         PLY
L216A    PLA
L216B    PLX
         BRA   L215D
L216E    PLY
         PLA
         PLX
         BRA   L218A
L2173    STX   L2181+1
         XBA
         AND   #$00FF
         TAX
         LDA   L216A,Y    ; 21B4
         AND   #$FF00
L2181    JSL   L29AB
         BCC   L218A
L2187    JMP   L2D85

L218A    PLY
         INY
         INY
         JMP   L213F

L2190    LDA   #$29AB
         STA   L2181+1
         STA   L2160+1
         LDY   #$297B
         LDX   #$0000
         LDA   #$77F0
         JSL   L2460
         LDY   L5520
         LDX   #$77F0
         BCC   L21B1
         LDX   #$0000

* We'll patch this JMPL to $5560 to
* install our new MLI vector

L21B1    JMPL  $020000

*---

L21B5    DW    $E030
         DW    $E020
         DW    $E044
         DW    $E059
         DW    $E062
         DW    $E06B
         DW    $E074
         DW    $E07D
         DW    $0200
         DW    $0300
         DW    $0E00
         DW    $0700
         DW    $82D4
         DW    $0000
L21D1    DA    $2474
         DA    $2474
         DA    $29AB
         DA    $2474
         DA    $2474
         DA    $2474
         DA    $2474
         DA    $29AB
         DA    $29AB
         DA    $29AB
         DA    $29AB
         DA    $29AB
         DA    $29AB

L21EB    STA   $0C
         LDA   #$0002
L21F0    STAL  $02FFFF
         INC   L21F0+2
         INC
         CMP   $0C
         BNE   L21F0
         LDA   #$0002
L21FF    CMPL  $02FFFF
         BNE   L2210
         INC   L21FF+2
         INC
         CMP   $0C
         BNE   L21FF
         SEC
         BRA   L2212
L2210    CLC
         TAX
L2212    LDA   #$02FF
         STA   L21F0+2
         STA   L21FF+2
         RTS

L221C    SEC
         XCE
         JSR   PRODOS8
         DB    $C6
         DA    L2232
         XCE
         CLC
         XCE
         REP   #$30
         BCC   L2231
         JSL   L2C07
         BRA   L221C
L2231    RTS

L2232    DB    $01        ; prefix
         DA    L2235

L2235    STR   "/RastanB"

L223E    TXA
         ASL
         ASL
         TAX
         LDA   L225F-8,X
         STA   L2297+$27
         LDA   L225F-6,X
         STA   L2297+$29
         PEA   $0000
         PEA   $0000
         PEA   $2297
L2257    CLC
L2258    _SysFailMgr

L225F    ASC   '0256'
         ASC   '0320'
         ASC   '0384'
         ASC   '0448'
         ASC   '0512'
         ASC   '0576'
         ASC   '0640'
         ASC   '0704'
         ASC   '0768'
         ASC   '0832'
         ASC   '0896'
         ASC   '0960'
         ASC   '1024'
         ASC   '1088'

L2297    STR   0D0D0D0D0D' Rastan requires 1152k. You have 0000k.'0D0D0D0D0D0D' '

L22CB    PHB              ; ENT
         PHD
         PHK
         PLB
         PEA   $0000
         PLD
         SEI
         ASL
         STA   L5510
         STA   L5512
         TAX
         LDY   L2418,X
         BMI   L22F0
         LDX   #$0002
         LDA   #$EC00
         JSL   L29AB
         BCC   L22F0
         JMP   L2410

L22F0    LDA   L5510
         ASL
         ADC   L5510
         STA   L5510
         TAY
         INY
         INY
         LDX   #$0004
         LDA   #$0000
         JSL   L29AB
         BCC   L230C
         JMP   L2410

L230C    LDA   #$1FFF
         LDX   #$0004
         LDY   #$5000
         MVN   $040000,$060000
         PHK
         PLB
         LDAL  $040000
         ASL
         STA   L5514
         LDAL  $040002
         STA   L5516
         LDA   L5510
         CLC
         ADC   #$0004
         TAY
         LDX   #$0004
         LDA   #$0000
         JSL   L29AB
         BCC   L2340
         JMP   L2410

L2340    LDA   #$1FFF
         LDX   #$0004
         LDY   #$3000
         MVN   $040000,$060000
         PHK
         PLB
         LDY   L5510
         LDX   #$0004
         LDA   #$0000
         JSL   L29AB
         BCC   L2360
         JMP   L2410

L2360    LDX   L5512
         LDY   L2430,X
         BMI   L237F
         LDA   L2449,X
         AND   #$00FF
         PHA
         LDA   L2447,X
         AND   #$FF00
         PLX
         JSL   L29AB
         BCC   L237F
         JMP   L2410

L237F    LDA   L5514
         STA   L23F1+1
         LDY   L5516
         LDA   #$0000
         TAX
         CLC
         PEA   $00E1
         PLB
L2391    STA   $A000,X
         STA   $A002,X
         STA   $A004,X
         STA   $A006,X
         STA   $A008,X
         STA   $A00A,X
         STA   $A00C,X
         STA   $A00E,X
         STA   $A010,X
         STA   $A012,X
         STA   $A014,X
         STA   $A016,X
         STA   $A018,X
         STA   $A01A,X
         STA   $A01C,X
         STA   $A01E,X
         STA   $A020,X
         STA   $A022,X
         STA   $A024,X
         STA   $A026,X
         STA   $A028,X
         STA   $A02A,X
         STA   $A02C,X
         STA   $A02E,X
         STA   $A030,X
         STA   $A032,X
         STA   $A034,X
         STA   $A036,X
         STA   $A038,X
         STA   $A03A,X
         STA   $A03C,X
         STA   $A03E,X
L23F1    ADC   #$0000
         PHA
         TXA
         ADC   #$0040
         TAX
         PLA
         DEY
         BEQ   L2401
         JMP   L2391

L2401    PLB
         STZ   L23F1+1
         LDA   L5514
         LDY   L5516
         PLD
         PLB
         CLI
         CLC
         RTL

L2410    PLD
         PLB
         STZ   L23F1+1
         CLI
         SEC
         RTL

L2418    DW    $FFFF
         DW    $0078
         DW    $007C
         DW    $007A
         DW    $0078
         DW    $007E
         DW    $007A
         DW    $0078
         DW    $0080
         DW    $007A
         DW    $0078
         DW    $0082
L2430    DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $68
         DB    $00
         DB    $FF
         DB    $FF
         DB    $6A
L2447    DB    $00
L2448    DB    $FF
L2449    DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $FF
         DB    $40
         DB    $05
         DB    $FF
         DB    $FF
         DB    $00
         DB    $05

L2460    PHB
         PHD
         SEI
         PHK
         PLB
         PEA   $0000
         PLD
         STX   L551A
         STA   L5518
         STY   L554D
         BRA   L2489

* LOAD FILE

L2474    SEI
         PHB
         PHD
         PHK
         PLB
         PEA   $0000
         PLD
         STX   L551A
         STA   L5518
         LDA   L24FF,Y
         STA   L554D
L2489    LDA   #$4000
         STA   L5548
         LDA   #$5800
         STA   L5546
         MX    %11
         SEC
         XCE
         JSR   L298D
         BCS   L24F3
L249C    JSR   L299D
         BCC   L24A7
         CMP   #$4C       ; end of data
         BNE   L24EE
         BRA   L24DC
L24A7    LDA   L551A
         STA   L24BB+1
         CLC
         XCE
         REP   #$30
         LDY   L5518
         LDX   #$5800
         LDA   L554A
         DEC
L24BB    MVN   $000000,$000000
         PHK
         PLB
         LDA   L554A
         CMP   L5548
         BNE   L24DC
         CLC
         ADC   L5518
         STA   L5518
         LDA   L551A
         ADC   #$0000
         STA   L551A
         SEC
         XCE
         BRA   L249C
L24DC    STZ   L24BB+1
         SEC
         XCE
         JSR   L29A4
         BCS   L24F3
         CLC
         XCE
         REP   #$31
         PLD
         PLB
         CLI
         RTL

L24EE    PHA
         JSR   L29A4
         PLA
L24F3    CLC
         XCE
         REP   #$30
         STZ   L24BB+1
         PLD
         PLB
         SEC
         CLI
         RTL

* POINTER TO FILENAMES

L24FF    DA    $2587
         DA    $2596
         DA    $25A5
         DA    $25B4
         DA    $25C3
         DA    $25D2
         DA    $25B4
         DA    $25C3
         DA    $25D2
         DA    $25E1
         DA    $25F0
         DA    $25FF
         DA    $260E
         DA    $261D
         DA    $262C
         DA    $260E
         DA    $261D
         DA    $262C
         DA    $263B
         DA    $264A
         DA    $2659
         DA    $2668
         DA    $2677
         DA    $2686
         DA    $2668
         DA    $2677
         DA    $2686
         DA    $2695
         DA    $26A4
         DA    $26B3
         DA    $26C2
         DA    $26D1
         DA    $26E0
         DA    $26EF
         DA    $26FE
         DA    $270D
         DA    $271C
         DA    $272A
         DA    $2737
         DA    $2746
         DA    $2754
         DA    $2763
         DA    $2772
         DA    $2781
         DA    $2790
         DA    $279B
         DA    $27AA
         DA    $27B9
         DA    $27C5
         DA    $27D3
         DA    $27E1
         DA    $27EF
         DA    $27FD
         DA    $280E
         DA    $2821
         DA    L2834      ; 6E
         DA    L2847      ; 70
         DA    L285A      ; 72
         DA    L286D      ; 74
         DA    L2880      ; 76
         DA    $2893
         DA    $289F
         DA    $28AE
         DA    $28BA
         DA    $28C6
         DA    $28D2
         DA    $28DE
         DA    $28E9

L2587    STR   "MAPS/RND1A.SET"
         STR   "MAPS/RND1A.MAP"
         STR   "MAPS/RND1A.FLG"
         STR   "MAPS/RND1C.SET"
         STR   "MAPS/RND1C.MAP"
         STR   "MAPS/RND1C.FLG"
         STR   "MAPS/RND2A.SET"
         STR   "MAPS/RND2A.MAP"
         STR   "MAPS/RND2A.FLG"
         STR   "MAPS/RND2C.SET"
         STR   "MAPS/RND2C.MAP"
         STR   "MAPS/RND2C.FLG"
         STR   "MAPS/RND3A.SET"
         STR   "MAPS/RND3A.MAP"
         STR   "MAPS/RND3A.FLG"
         STR   "MAPS/RND3C.SET"
         STR   "MAPS/RND3C.MAP"
         STR   "MAPS/RND3C.FLG"
         STR   "MAPS/RND4A.SET"
         STR   "MAPS/RND4A.MAP"
         STR   "MAPS/RND4A.FLG"
         STR   "MAPS/RND4B.SET"
         STR   "MAPS/RND4B.MAP"
         STR   "MAPS/RND4B.FLG"
         STR   "MAPS/RND4C.SET"
         STR   "MAPS/RND4C.MAP"
         STR   "MAPS/RND4C.FLG"
         STR   "RASTAN/ARCADE"
         STR   "RASTAN/TITLE"
         STR   "RASTAN/BONFIRE"
         STR   "RASTAN/THRONE"
         STR   "RASTAN/ENDPIC1"
         STR   "RASTAN/ENDPIC2"
         STR   "RASTAN/ENDPIC3"
         STR   "RASTAN/ENDPIC4"
         STR   "RASTAN/ART"
         STR   "RASTAN/RASTAN1"
         STR   "RASTAN/RASTAN2"
         STR   "RASTAN/COIN"
         STR   "RASTAN/SOUND1"
         STR   "RASTAN/SOUND4"
         STR   "RASTAN/SOUND2"
         STR   "RASTAN/SOUND3"
         STR   "RASTAN/LIGHTNING"
         STR   "RASTAN/DRAGONFLAME"
         STR   "RASTAN/RASTSHPDATA"
L2834    STR   "RASTAN/RNDASHPDATA"
L2847    STR   "RASTAN/RND1SHPDATA"
L285A    STR   "RASTAN/RND2SHPDATA"
L286D    STR   "RASTAN/RND3SHPDATA"
L2880    STR   "RASTAN/RND4SHPDATA"
         STR   "RASTAN/DCBB"
         STR   "RASTAN/DCBSKEL"
         STR   "RASTAN/DCB1"
         STR   "RASTAN/DCB2"
         STR   "RASTAN/DCB3"
         STR   "RASTAN/DCB4"
         STR   "RASTAN/END"
         STR   "RASTAN/ENDPIC"

* SAVE SCORE

L28F7    PHB              ; ENT
         PHD              ; SAVE SCORE
         SEI
         LDAL  $020000,X
         STAL  L5528
         DEC
         LDY   #$77F0
         MVN   $020000,$000000
         PHK
         PLB
         LDA   #$0000
         TCD
         SEP   #$20
         LDX   #$0000
         LDA   #$00
L2916    EOR   $77F0,X
         INX
         CPX   L5528
         BCC   L2916
         EOR   $77EF,X
         STA   $77EF,X
         REP   #$20
         MX    %11
         SEC
         XCE
L2929    JSR   PRODOS8
         DB    $C0        ; CREATE
         DA    L5533
         BCC   L2940
         CMP   #$47       ; duplicate filename
         BNE   L293D
         JSR   PRODOS8
         DB    $C1        ; DESTROY
         DA    L553F
         BCC   L2929
L293D    JMP   L2968

L2940    JSR   PRODOS8
         DB    $C8        ; OPEN
         DA    L552C
         BCS   L2968
         LDA   L5531
         STA   L5523
         STA   L5525
         JSR   PRODOS8
         DB    $CB        ; WRITE
         DA    L5524
         BCS   L2968
         JSR   PRODOS8
         DB    $CC        ; CLOSE
         DA    L5522
         CLC
         XCE
         REP   #$31
         SEC
         PLD
         PLB
         CLI
         RTL

L2968    JSR   PRODOS8
         DB    $CC
         DA    L5522
         CLC
         XCE
         REP   #$30
         JSL   L2CCD
         SEC
         PLD
         PLB
         CLI
         RTL

L297B    STR   "RASTAN/HIGHSCORES"

L298D    JSR   PRODOS8
         DB    $C8        ; OPEN
         DA    L554C
         LDX   L5551
         STX   L5543
         STX   L5545
         RTS

L299D    JSR   PRODOS8
         DB    $CA        ; READ
         DA    L5544
         RTS

L29A4    JSR   PRODOS8
         DB    $CC
         DA    L5542
         RTS

L29AB    PHB
         PHD
         SEI
         PHK
         PLB
         PEA   $0000
         PLD
         STX   $82
         STA   $80
         LDA   L24FF,Y
         STA   L554D
         SEC
         XCE
         JSR   L298D
         BCS   L29DE
         XCE
         REP   #$30
         JSR   L29E7
         PEA   $0000
         PLD
         SEC
         XCE
         JSR   L29A4
         BCS   L29DE
         CLC
         XCE
         REP   #$30
         PLD
         PLB
         CLC
         RTL

L29DE    CLC
         XCE
         REP   #$30
         PLD
         PLB
         SEC
         CLI
         RTL

L29E7    LDA   #$0000     ; unpacker?
         TCD
         TSC
         STA   $84
         LDA   #$1FFF
         TCS
         LDX   #$1FF0
         LDY   #$5800
         JSR   L2B09
         LDA   #$0009
         STA   $90
         STZ   $96
         PEA   $FFFF
L2A05    JSR   L2AAD
         CMP   #$0101
         BEQ   L2A85
         CMP   #$0100
         BEQ   L2A6C
         STA   $8C
         CMP   $8E
         BCC   L2A1C
         LDA   $8A
         PEI   $86
L2A1C    STA   $88
         CMP   #$0100
         BCC   L2A36
         ASL
         ASL
L2A25    TAY
         LDA   $77F2,Y
         PHA
         LDA   $77F0,Y
         CMP   #$0400
         BCS   L2A25
         LSR
         LSR
         STA   $88
L2A36    AND   #$00FF
         STA   $86
         STA   $94
         LDY   #$0000
L2A40    STA   [$80],Y
         INY
         PLA
         BPL   L2A40
         PHA
         TYA
         CLC
         ADC   $80
         STA   $80
         BCC   L2A51
         INC   $82
L2A51    JSR   L2A99
         LDA   $8C
         STA   $8A
         LDA   $8E
         CMP   $92
         BCC   L2A6A
         LDA   $90
         CMP   #$000C
         BEQ   L2A6A
         INC
         STA   $90
         ASL   $92
L2A6A    BRA   L2A05
L2A6C    JSR   L2A89
         JSR   L2AAD
         STA   $88
         STA   $8A
         STA   $94
         STA   $86
         STA   [$80]
         INC   $80
         BNE   L2A82
         INC   $82
L2A82    JMP   L2A05

L2A85    LDA   $84
         TCS
         RTS

L2A89    LDA   #$0009
         STA   $90
         LDA   #$0200
         STA   $92
         LDA   #$0102
         STA   $8E
         RTS

L2A99    LDA   $8E
         ASL
         ASL
         TAY
         LDA   $94
         STA   $77F2,Y
         LDA   $8A
         ASL
         ASL
         STA   $77F0,Y
         INC   $8E
         RTS

L2AAD    LDA   $96
         AND   #$0007
         TAX
         LDA   $96
         LSR
         LSR
         LSR
         CMP   #$1FEC
         BCC   L2ADD
         LDA   $77EC
         STA   $5800
         LDA   $77EE
         STA   $5802
         LDA   $96
         SEC
         SBC   #$FF60
         STA   $96
         LDY   #$5804
         LDX   #$1FEC
         JSR   L2B09
         JMP   L2AAD

L2ADD    TAY
         LDA   $5800,Y
         STA   $0C
         INY
         INY
         LDA   $5800,Y
         TXY
         BEQ   L2AF1
L2AEB    LSR
         ROR   $0C
         DEX
L2AEF    BNE   L2AEB
L2AF1    LDA   $90
         ASL
         TAX
         LDA   $96
         ADC   $90
         STA   $96
         LDA   $0C
         AND   L2AEF,X    ; 2B01
         RTS

L2B01    DW    $01FF
         DW    $03FF
         DW    $07FF
         DW    $0FFF
L2B09    LDA   #$0000
         TCD
         STX   L5548
         STY   L5546
         TSX
         LDA   #$017F
         TCS
         PHX
         SEC
         XCE
         JSR   L299D
         CLC
         XCE
         REP   #$30
         PLA
         TCS
         LDA   #$0000
         TCD
         RTS

         PHP              ; ENT unpacker?
         SEI
         PHD
         PHB
         PHK
         PLB
         LDA   #$0000
         TCD
         TSC
         STA   $84
         LDA   #$1FFF
         TCS
         LDA   #$0009
         STA   $90
         STZ   $96
         PEA   $FFFF
L2B44    JSR   L2BC3
         CMP   #$0101
         BEQ   L2BBC
         CMP   #$0100
         BEQ   L2BA7
         STA   $8C
         CMP   $8E
         BCC   L2B5B
         LDA   $8A
         PEI   $86
L2B5B    STA   $88
         CMP   #$0100
         BCC   L2B75
         ASL
         ASL
L2B64    TAY
         LDA   $77F2,Y
         PHA
         LDA   $77F0,Y
         CMP   #$0400
         BCS   L2B64
         LSR
         LSR
         STA   $88
L2B75    AND   #$00FF
         STA   $86
         STA   $94
         LDY   #$0000
L2B7F    STA   [$80],Y
         INY
         PLA
         BPL   L2B7F
         PHA
         TYA
         CLC
         ADC   $80
         STA   $80
         JSR   L2A99
         LDA   $8C
         STA   $8A
         LDA   $8E
         CMP   $92
         BCC   L2BA5
         LDA   $90
         CMP   #$000C
         BEQ   L2BA5
         INC
         STA   $90
         ASL   $92
L2BA5    BRA   L2B44
L2BA7    JSR   L2A89
         JSR   L2BC3
         STA   $88
         STA   $8A
         STA   $94
         STA   $86
         STA   [$80]
         INC   $80
         JMP   L2B44

L2BBC    LDA   $84
         TCS
         PLB
         PLD
         PLP
         RTL

L2BC3    LDA   $96
         AND   #$0007
         TAX
         LDA   $96
         LSR
         LSR
         LSR
         CMP   #$03FD
         BCC   L2BDD
         CLC
         ADC   $7C
         STA   $7C
         STX   $96
         LDA   #$0000
L2BDD    TAY
         LDA   [$7C],Y
         STA   $0C
         INY
         INY
         LDA   [$7C],Y
         TXY
         BEQ   L2BEF
L2BE9    LSR
         ROR   $0C
         DEX
L2BED    BNE   L2BE9
L2BEF    LDA   $90
         ASL
         TAX
         LDA   $96
         ADC   $90
         STA   $96
         LDA   $0C
         AND   L2BED,X    ; 2BFF
         RTS

         DW    $01FF
         DW    $03FF
         DW    $07FF
         DW    $0FFF

* KO... INSERT RASTANB

L2C07    PHB              ; file load error
         PHD
         PHK
         PLB
         PEA   $0000
         PLD
         AND   #$00FF
         CMP   #$0045     ; volume dir does not exist
         BEQ   L2C1F
         CMP   #$0046     ; file does not exist
         BEQ   L2C1F
         JMP   L2D85

L2C1F    LDAL  $E19E1E
         STA   L551C
         LDAL  $E19E3E
         STA   L551E
         LDA   #$0FFF
         STAL  $E19E1E
         STAL  $E19E3E
         LDA   #$3ECB
         LDX   #$0022
         LDY   #$0048
         JSR   L2DC0
         LDA   #$0000
         TCD
         LDA   #$0038
         STA   $20
         LDA   #$0040
         STA   $22
         LDA   #$2CA8
         JSL   $03C035
         LDA   #$0044
         STA   $20
         LDA   #$0050
         STA   $22
         LDA   #$2CB6
         JSL   $03C035
         LDA   #$0034
         STA   $20
         LDA   #$0070
         STA   $22
         LDA   #$2CBD
         JSL   $03C035
         SEP   #$20
         STAL  $E0C010
L2C81    LDAL  $E0C000
         BPL   L2C81
         STAL  $E0C010
         LDA   L551C
         STAL  $E19E1E
         LDA   L551E
         STAL  $E19E3E
         REP   #$30
         LDX   #$3ECB
         TXY
         LDA   #$333F
         MVN   $010000,$E10000
         PLD
         PLB
         RTL

L2CA8    STR   "PLEASE INSERT"
L2CB6    STR   "DISK B"
L2CBD    STR   "AND PRESS A KEY"

L2CCD    PHB              ; HS save failed
         PHD
         PHK
         PLB
         PEA   $0000
         PLD
         LDAL  $E19E1E
         STA   L551C
         LDAL  $E19E3E
         STA   L551E
         LDA   #$0FFF
         STAL  $E19E1E
         STAL  $E19E3E
         LDA   #$3ECB
         LDX   #$0022
         LDY   #$0048
         JSR   L2DC0
         LDA   #$0000
         TCD
         LDA   #$0034
         STA   $20
         LDA   #$0040
         STA   $22
         LDA   #L2D5E
         JSL   $03C035
         LDA   #$003A
         STA   $20
         LDA   #$0050
         STA   $22
         LDA   #L2D6D
         JSL   $03C035
         LDA   #$003A
         STA   $20
         LDA   #$0070
         STA   $22
         LDA   #L2D79
         JSL   $03C035
         SEP   #$20
         STAL  $E0C010
L2D37    LDAL  $E0C000
         BPL   L2D37
         STAL  $E0C010
         LDA   L551C
         STAL  $E19E1E
         LDA   L551E
         STAL  $E19E3E
         REP   #$30
         LDX   #$3ECB
         TXY
         LDA   #$333F
         MVN   $010000,$E10000
         PLD
         PLB
         RTL

L2D5E    STR   "COULD NOT SAVE"
L2D6D    STR   "HIGH SCORES"
L2D79    STR   "PRESS A KEY"

L2D85    PHK
         PLB
         PEA   $0000
         PLD
         AND   #$00FF
         PHA
         PEA   $0000
         PEA   $2D9E
         _SysFailMgr
L2D9C    BRA   L2D9C
         STR   0D0D0D0D0D'        Fatal Prodos Error #'
L2DC0    STA   $0C
         STX   $0E
         STY   $10
         LDY   #$0000
         JSR   L2E0D
         LDY   #$000A
         JSR   L2E0D
         LDY   #$000A
         JSR   L2E0D
         LDY   #$0014
         JSR   L2E0D
         LDY   #$0014
         JSR   L2E0D
L2DE4    LDY   #$001E
         JSR   L2E0D
         DEC   $10
         BNE   L2DE4
         LDY   #$0014
         JSR   L2E0D
         LDY   #$0014
         JSR   L2E0D
         LDY   #$000A
         JSR   L2E0D
         LDY   #$000A
         JSR   L2E0D
         LDY   #$0000
         JSR   L2E0D
         RTS

L2E0D    LDX   $0C
         LDA   L2E44,Y
         STAL  $E10000,X
         LDA   L2E44+2,Y
         STAL  $E10002,X
         PHY
         LDA   L2E44+4,Y
         LDY   $0E
L2E23    STAL  $E10004,X
         INX
         INX
         DEY
         BNE   L2E23
         PLY
         LDA   L2E44+6,Y
         STAL  $E10004,X
         LDA   L2E44+8,Y
         STAL  $E10006,X
         LDA   $0C
         CLC
         ADC   #$00A0
         STA   $0C
         RTS

L2E44    HEX   0000000000000000000000FFFFFFFFFF
         HEX   FFFFFF0000FFF0000000000FFF0000FF
         HEX   F000FFFF000FFF00
L2E6C    LDY   #$1380
L2E6F    PHY
L2E70    LDAL  $E0C02E
         AND   #$00FF
         CMP   #$00A0
         BNE   L2E70
         JSR   L2FB2
         PLA
         SEC
         SBC   #$00C0
         TAY
         BNE   L2E6F
         LDA   #$207F
         STA   $0C
         LDA   #$0042
         STA   $0E
         LDA   #$00A0
         STA   $10
L2E96    LDAL  $E0C02E
         AND   #$00FF
         CMP   $10
         BNE   L2E96
         LDX   $0C
         JSR   L3119
         LDA   $0C
         JSR   L2EBE
         LDA   $0E
         BEQ   L2EBD
         LDA   $0C
         CLC
         ADC   #$0140
         STA   $0C
         DEC   $0E
         INC   $10
         BRA   L2E96
L2EBD    RTS

L2EBE    LDY   #$0000
         TSX
         SEI
         TCS
         LDA   #$0010
         TSB   STATEREG
         LDA   #$0018
         TRB   SHADOW
         CLC
L2ED1    LDA   L3135+$5E,Y
         PHA
         LDA   L3135+$5C,Y
         PHA
         LDA   L3135+$5A,Y
         PHA
         LDA   L3135+$58,Y
         PHA
         LDA   L3135+$56,Y
         PHA
         LDA   L3135+$54,Y
         PHA
         LDA   L3135+$52,Y
         PHA
         LDA   L3135+$50,Y
         PHA
         LDA   L3135+$4E,Y
         PHA
         LDA   L3135+$4C,Y
         PHA
         LDA   L3135+$4A,Y
         PHA
         LDA   L3135+$48,Y
         PHA
         LDA   L3135+$46,Y
         PHA
         LDA   L3135+$44,Y
         PHA
         LDA   L3135+$42,Y
         PHA
         LDA   L3135+$40,Y
         PHA
         LDA   L3135+$3E,Y
         PHA
         LDA   L3135+$3C,Y
         PHA
         LDA   L3135+$3A,Y
         PHA
         LDA   L3135+$38,Y
         PHA
         LDA   L3135+$36,Y
         PHA
         LDA   L3135+$34,Y
         PHA
         LDA   L3135+$32,Y
         PHA
         LDA   L3135+$30,Y
         PHA
         LDA   L3135+$2E,Y
         PHA
         LDA   L3135+$2C,Y
         PHA
         LDA   L3135+$2A,Y
         PHA
         LDA   L3135+$28,Y
         PHA
         LDA   L3135+$26,Y
         PHA
         LDA   L3135+$24,Y
         PHA
         LDA   L3135+$22,Y
         PHA
         LDA   L3135+$20,Y
         PHA
         LDA   L3135+$1E,Y
         PHA
         LDA   L3135+$1C,Y
         PHA
         LDA   L3135+$1A,Y
         PHA
         LDA   L3135+$18,Y
         PHA
         LDA   L3135+$16,Y
         PHA
         LDA   L3135+$14,Y
         PHA
         LDA   L3135+$12,Y
         PHA
         LDA   L3135+$10,Y
         PHA
         LDA   L3135+$E,Y
         PHA
         LDA   L3135+$C,Y
         PHA
         LDA   L3135+$A,Y
         PHA
         LDA   L3135+8,Y
         PHA
         LDA   L3135+6,Y
         PHA
         LDA   L3135+4,Y
         PHA
         LDA   L3135+2,Y
         PHA
         LDA   L3135,Y
         PHA
         TSC
         ADC   #$0100
         TCS
         TYA
         ADC   #$0060
         TAY
         CPY   #$13E0
         BCS   L2FA3
         JMP   L2ED1

L2FA3    LDA   #$0010
         TRB   STATEREG
         LDA   #$0018
         TSB   SHADOW
         TXS
         CLI
         RTS

L2FB2    LDX   #$2020
         CLC
L2FB6    LDA   L3135,Y
         STAL  $E10000,X
         LDA   L3135+2,Y
         STAL  $E10002,X
         LDA   L3135+4,Y
         STAL  $E10004,X
         LDA   L3135+6,Y
         STAL  $E10006,X
         LDA   L3135+8,Y
         STAL  $E10008,X
         LDA   L3135+$A,Y
         STAL  $E1000A,X
         LDA   L3135+$C,Y
         STAL  $E1000C,X
         LDA   L3135+$E,Y
         STAL  $E1000E,X
         LDA   L3135+$10,Y
         STAL  $E10010,X
         LDA   L3135+$12,Y
         STAL  $E10012,X
         LDA   L3135+$14,Y
         STAL  $E10014,X
         LDA   L3135+$16,Y
         STAL  $E10016,X
         LDA   L3135+$18,Y
         STAL  $E10018,X
         LDA   L3135+$1A,Y
         STAL  $E1001A,X
         LDA   L3135+$1C,Y
         STAL  $E1001C,X
         LDA   L3135+$1E,Y
         STAL  $E1001E,X
         LDA   L3135+$20,Y
         STAL  $E10020,X
         LDA   L3135+$22,Y
         STAL  $E10022,X
         LDA   L3135+$24,Y
         STAL  $E10024,X
         LDA   L3135+$26,Y
         STAL  $E10026,X
         LDA   L3135+$28,Y
         STAL  $E10028,X
         LDA   L3135+$2A,Y
         STAL  $E1002A,X
         LDA   L3135+$2C,Y
         STAL  $E1002C,X
         LDA   L3135+$2E,Y
         STAL  $E1002E,X
         LDA   L3135+$30,Y
         STAL  $E10030,X
         LDA   L3135+$32,Y
         STAL  $E10032,X
         LDA   L3135+$34,Y
         STAL  $E10034,X
         LDA   L3135+$36,Y
         STAL  $E10036,X
         LDA   L3135+$38,Y
         STAL  $E10038,X
         LDA   L3135+$3A,Y
         STAL  $E1003A,X
         LDA   L3135+$3C,Y
         STAL  $E1003C,X
         LDA   L3135+$3E,Y
         STAL  $E1003E,X
         LDA   L3135+$40,Y
         STAL  $E10040,X
         LDA   L3135+$42,Y
         STAL  $E10042,X
         LDA   L3135+$44,Y
         STAL  $E10044,X
         LDA   L3135+$46,Y
         STAL  $E10046,X
         LDA   L3135+$48,Y
         STAL  $E10048,X
         LDA   L3135+$4A,Y
         STAL  $E1004A,X
         LDA   L3135+$4C,Y
         STAL  $E1004C,X
         LDA   L3135+$4E,Y
         STAL  $E1004E,X
         LDA   L3135+$50,Y
         STAL  $E10050,X
         LDA   L3135+$52,Y
         STAL  $E10052,X
         LDA   L3135+$54,Y
         STAL  $E10054,X
         LDA   L3135+$56,Y
         STAL  $E10056,X
         LDA   L3135+$58,Y
         STAL  $E10058,X
         LDA   L3135+$5A,Y
         STAL  $E1005A,X
         LDA   L3135+$5C,Y
         STAL  $E1005C,X
         LDA   L3135+$5E,Y
         STAL  $E1005E,X
         TXA
         ADC   #$00A0
         TAX
         TYA
         ADC   #$0060
         TAY
         CPY   #$13E0
         BCS   L3118
         JMP   L2FB6
L3118    RTS

L3119    LDA   #$0018
         TRB   SHADOW
         TXA
         SEC
         SBC   #$019F
         TAY
         TAX
         LDA   #$00FF
         MVN   $060000,$010000
         PHK
         PLB
         LDA   #$0018
         TSB   SHADOW
         RTS

L3135    HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   87555767755576765656776555755775
         HEX   55777557557555777557575557775575
         HEX   57775777676567755576767755577755
         HEX   75775557775575755577755775557775
         HEX   57557667555777557557555777575575
         HEX   55777557557666555777557557666660
         HEX   87577767757776665557775566565677
         HEX   55576765657755576765677555767656
         HEX   56775777666575557775575576665676
         HEX   56777555767656775557676577555777
         HEX   55755766655576765755577755755766
         HEX   65576765657555777557557666575760
         HEX   87577777757777766566657776555777
         HEX   57776665557757776665577577766655
         HEX   57775777776677555767656565111111
         HEX   25777577775557775575576667755576
         HEX   76565677657557557666557676565677
         HEX   65776665557755576765656776575750
         HEX   85577000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000001444444
         HEX   42000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000008555570
         HEX   87666508888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888714444444
         HEX   44288888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888808757560
         HEX   87677708767775576665577756567677
         HEX   66655576677766655577777666555766
         HEX   76755577755755766657677144444444
         HEX   44476775577577777665666576557777
         HEX   76776665657766566657777776776665
         HEX   65656567776557777767766608575770
         HEX   86675508775575576665577777766577
         HEX   67775576667767775577777677755766
         HEX   66775557676565677655766144444444
         HEX   44455567755755766657666566766655
         HEX   57667667777767766656565557667667
         HEX   77555777777766655576676608777770
         HEX   85577508767656567765575577757666
         HEX   55656656677667657556676676575566
         HEX   66775777666555777555766144444444
         HEX   44465655676565677656766765567775
         HEX   55777557557666576677777557666557
         HEX   77755576657767775576665508767660
         HEX   86677508766655577755756677756776
         HEX   55676677775556677577755566714777
         HEX   77775766676656665775566144444444
         HEX   44455555566555777556655775567677
         HEX   57766755656775557775575576665757
         HEX   77766776777667657556677508777760
         HEX   86677508777665666577656675557775
         HEX   55575576665666677576776666714767
         HEX   77755766676776665655777244444444
         HEX   44256666576656665776775775556677
         HEX   57756655557777555767656567765657
         HEX   55766766675556677575776508575750
         HEX   86665508777677666565766656666657
         HEX   77656567765667667555766676144257
         HEX   77776665557667667775767724444444
         HEX   42556665676776665656667555766566
         HEX   55557766566677577766655577755775
         HEX   66557766667666677575777708656570
         HEX   87777608555766766667667756666656
         HEX   55655577755755766655556675144455
         HEX   56776577776677677755766652444444
         HEX   25665666557677667776677756666767
         HEX   75557767766677577667665666577765
         HEX   66766655556667667557577608777660
         HEX   86677608755766656667556766675576
         HEX   66565666577565677655766651444445
         HEX   75566575576676667565677755566556
         HEX   55666556557677557776677756666677
         HEX   76655576676665577667677666565676
         HEX   66767775765667557676556708557660
         HEX   87776608575566775777576667756567
         HEX   76577666565555777555677614444444
         HEX   06555756655776611755777777555656
         HEX   55665555555667757775567757776677
         HEX   67775576665577666555766766777666
         HEX   77667657665777557757676608665570
         HEX   80755508775777765755577766655577
         HEX   75566766777656665775777514444444
         HEX   26666656676611145656665777755555
         HEX   56555656757777657555766557776676
         HEX   67657556677577677755766655777766
         HEX   75556677566755767556676608667660
         HEX   80776608775767777566577777665666
         HEX   57766655777776665656665144444444
         HEX   45556766671144266576665777757775
         HEX   66655557757677775666657766655555
         HEX   56677577776576676575566775777755
         HEX   77666677577755775556666708777660
         HEX   80766608FFFFFFFFFFFFFFFFFFFFFFFF
         HEX   FFFFFFFFFFF667667776661444444444
         HEX   42557771114446666566667FFFFFFFFF
         HEX   FFF667667FFFFFFFFFFFFFFFFFFFFFFF
         HEX   FFFFFFFFFFFFF556677577776FFFFFFF
         HEX   FFFFFFFFFFFFFFF56675576708557660
         HEX   80756608F88888888888888888888888
         HEX   88888888888666557777661444444444
         HEX   44557114444466666656557F88888888
         HEX   888667557F8888888888888888888888
         HEX   88888888888886666775767FF8888888
         HEX   88888888888888888677557508665570
         HEX   80657708F88888888888888888888888
         HEX   88888888888667757776514444444444
         HEX   44611444444666566667757F88888888
         HEX   888777557F8888888888888888888888
         HEX   888888888888866766755FF888888888
         HEX   88888888888888888886765608667660
         HEX   80776708F88888888888888888888888
         HEX   88888888888777657557144444444444
         HEX   46444444446555567777657F88888888
         HEX   888665577F8888888888888888888888
         HEX   88888888888886675576F88888888888
         HEX   88888888888888888888665508777750
         HEX   80776508F88888888888888888888888
         HEX   88888888888555665667144444444446
         HEX   55444444466655657677775F88888888
         HEX   888556555F8888888888888888888888
         HEX   8888888888888555655F888888888888
         HEX   88888888888888888888866508656570
         HEX   80775708F88888888888888888888888
         HEX   88888888888665566661444444444465
         HEX   65544444666555655577765F88888888
         HEX   888565565F8888888888888888888888
         HEX   888888888888855556F8888888888888
         HEX   88888888888888888888886708656560
         HEX   8755560876675656565F888888888886
         HEX   55665656565565555614444444444665
         HEX   56614445555655767555676F88888888
         HEX   888655555666657665655F8888888888
         HEX   85666665556555655F88888888888888
         HEX   88556588888888888888888508676770
         HEX   8775550875576555555F888888888886
         HEX   65566655555555555714444444446566
         HEX   55661425555555777555777F88888888
         HEX   888555556666656666556F8888888888
         HEX   86655555566565655F88888888888888
         HEX   65566655888888888888888508575770
         HEX   8775750875577655555F888888888885
         HEX   56555665666655555144444444445655
         HEX   66665446665666677755576F88888888
         HEX   888656565676677556555F8888888888
         HEX   8556665555566555F888888888888865
         HEX   66655555568888888888888808777660
         HEX   8775770876656555656F888888888885
         HEX   55555655666565661444444444456555
         HEX   56661446765667667757776F88888888
         HEX   888655555765577555555F8888888888
         HEX   8665555556666556F888888888888665
         HEX   55565565656888888888888808557660
         HEX   8655770876776676676F888888888886
         HEX   66555555757667571444444444555566
         HEX   66614444766667557757777F88888888
         HEX   888555555677577766766F8888888888
         HEX   855655655776665F8888888888886655
         HEX   65555555575588888888888807665770
         HEX   8555770857557666566F888888888886
         HEX   55565665575556614444444446655565
         HEX   66144444455677556557777F88888888
         HEX   888565656776575566655F8888888888
         HEX   855555555766677F8888888888865666
         HEX   5555556677577F888888888807667660
         HEX   8755570865656776566F888888888886
         HEX   56565667777666144444444455665666
         HEX   66144444426557677766655F88888888
         HEX   888665555777756666775F8888888888
         HEX   865556555557776F8888888888865555
         HEX   6556666677576F888888888807555670
         HEX   8755570855755766656F888888888886
         HEX   55555665776667144444444465555556
         HEX   61444444445565577767775F88888888
         HEX   888566566777675557775F8888888888
         HEX   865656576755567F8888888888855655
         HEX   5555667667555F888888888807555660
         HEX   8775550876565677655F888888888885
         HEX   66565777675661444444444555555666
         HEX   14444444444565557666557F88888888
         HEX   888565566556777556667F8888888888
         HEX   856655557555766F8888888888856556
         HEX   6677667557675F888888888807656660
         HEX   8775770866555777555F888888888885
         HEX   56665777575714444444444665556666
         HEX   14444444444265656776577F88888888
         HEX   888556656576677576666F8888888888
         HEX   866655666657757F8888888888885665
         HEX   6565777557755F888888888807666550
         HEX   8775770876656665775F888888888886
         HEX   55566777577514444444446555655661
         HEX   44444444444256657775577F88888888
         HEX   888556665675577577777F8888888888
         HEX   86566657765665768888888888888666
         HEX   577757755577F8888888888807555570
         HEX   8655770876776665655F888888888885
         HEX   55565755665144444444446565656661
         HEX   44444444444446656657767F88888888
         HEX   888556655775565577777F8888888888
         HEX   86555567755765668888888888888865
         HEX   57777677555F88888888888807555570
         HEX   8776660857667667775F888888888886
         HEX   55556566671444444444455665556614
         HEX   44444444444442666656557F88888888
         HEX   888565556557577666555F8888888888
         HEX   85565556577755776888888888888888
         HEX   677777775FF888888888888607555570
         HEX   8776770857666556677F888888888885
         HEX   56556566771444444444466665566614
         HEX   44444444444442555677757F88888888
         HEX   888666555765677677755F8888888888
         HEX   85655666565577665888888888888888
         HEX   8755557FF88888888888888507555750
         HEX   8766760855667756675F888888888886
         HEX   56556666714444444444666566657614
         HEX   44444444444444455577755F88888888
         HEX   888555555665576676575F8888888888
         HEX   85566566777665775588888888888888
         HEX   888FFFF8888888888888886507656650
         HEX   8555660857777555777F888888888886
         HEX   55565677144444444444566555566614
         HEX   44444444444444425557775F88888888
         HEX   888655656766555566775F8888888888
         HEX   85566655777667777578888888888888
         HEX   88888888888888888888856607555760
         HEX   8766660857677755576F888888888886
         HEX   55666675144444444444665565566144
         HEX   44444444444444446556555F88888888
         HEX   888555556767776666775F8888888888
         HEX   85566555777777577577888888888888
         HEX   88888888888888888888655507565760
         HEX   8666760855577777776F888888888886
         HEX   66555751444444444445666565566144
         HEX   44444444444444442565667F88888888
         HEX   888656565576666676675F8888888888
         HEX   85655565755777577567788888888888
         HEX   88888888888888888885555507567560
         HEX   8566750867557777777F888888888885
         HEX   55655614444444444446556556777144
         HEX   44444444444444444466566F88888888
         HEX   888665566576656666576F8888888888
         HEX   86665557566755765576777888888888
         HEX   88888888888888888566655507656550
         HEX   8577750875556557777F888888888886
         HEX   55555144444444444445555565767144
         HEX   44444444444444444445557F88888888
         HEX   888565565556657766577F8888888888
         HEX   85555556566566777666555668888888
         HEX   88888888888888855565556507667660
         HEX   85666708755577666555766766556665
         HEX   55556675576755666556665565557776
         HEX   56656556565665555655657657556565
         HEX   55555555557777657555775557666555
         HEX   56556567666566777677755766555556
         HEX   55666565565556555665656507766650
         HEX   85566708767577777755766656665555
         HEX   55656775577556556556656556755567
         HEX   66665555666655655555556775667555
         HEX   55656555557677775667576777565565
         HEX   55555566677666667776575566765555
         HEX   66566655665656555556655508756650
         HEX   85577708775577776575566775556556
         HEX   56566666565665555556665567775766
         HEX   67755666566555565565656665666565
         HEX   55555665555577765667555777665556
         HEX   55565655766677767766775777765655
         HEX   66655655556655565666655608775560
         HEX   87766608576655566775777766555555
         HEX   56665766777655656555565556776676
         HEX   67755655665565665555666556665556
         HEX   65565666567555676667675556765566
         HEX   65555565557777766666775767777565
         HEX   66555555666655666665677608557660
         HEX   85556600000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000008665570
         HEX   87666688888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888888888
         HEX   88888888888888888888888888567660
         HEX   86666555777556655775567677577667
         HEX   55656775557775575565557775566557
         HEX   75567677577667556567755577755755
         HEX   76665757777667767776676575566567
         HEX   66657675556766675576755567667666
         HEX   67756666766666676675557776565660
         HEX   85666656665776775775556677577566
         HEX   55557777555767656566566657767757
         HEX   75556677577566555577775557676565
         HEX   67765657557667666755566775757767
         HEX   75776675565677555777557557666575
         HEX   77776677677766765755667776565660
         HEX   85777557755576667766677666775576
         HEX   66775766677555766677576667755576
         HEX   66777666775577555766677777557755
         HEX   57666775577665666577677577555667
         HEX   75775665555777755576765656776565
         HEX   75576676667555667757575567666660
         HEX   80000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000020000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000002000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000200000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000022000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000022200000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000255200000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000025522000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000025520000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000002255000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000002220000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000002222000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000222200000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000025522000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000255220000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   0000000000000000000000002AA22000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000000022FFF24000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000000000000000000000002FFFFF440
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000040227F7774400000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000040004477CC7244
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000004457CAA72442000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000200255577777244
         HEX   20000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   2202455C7777C4400000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000022004455C77CC7440
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000022
         HEX   22455CC7777774400022000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000224455CD7777777544
         HEX   00022000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000025
         HEX   555CD77777CC75244002200000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000000000000002555DDD7777CCC7524
         HEX   42022200000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000255
         HEX   5CDD7777777775554422200034000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   0000000000002255CCDD77F77777AD55
         HEX   54242000024000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000002002245
         HEX   5DDD77F777CC7DD55244444000200000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000000222207FFFFFFFFFFFFFFFF7FFF
         HEX   FFFFFFFFF72220000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000002DDD277777
         HEX   7777777F1EF367777777777777222200
         HEX   00000000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   000000DDDDD277777777777FEF1E7D7D
         HEX   A754777772D4D2400000000000000000
         HEX   00000000000000000000000000000000
         HEX   0000000000000000000002D4ADCBB577
         HEX   5C7777777FFF177DA772277744D4D222
         HEX   00040000000000000000000000000000
         HEX   00000000000000000000000000000000
         HEX   00002D4D55B7775757777777FFF477DD
         HEX   AA77B724222D4DDD2400440000000000
         HEX   00000000000000000000000000000000
         HEX   0000000000000000000ADD4D5C77727A
         HEX   CC77777FF7F5F7AADD777A24422D24DD
         HEX   22024440000000000000000000000000
         HEX   00000000000000000000000000022000
         HEX   000244CCB777775DC777777FFCCCF77A
         HEX   D77777A2BB2224D52D2A222000000000
         HEX   00000000000000000000000000000000
         HEX   000000000002000000044CBB7777775D
         HEX   C7777F7FF77CF77BAA77777A22BB7AAA
         HEX   2DD22242000000000000000000000000
         HEX   00000000000000000000000000020000
         HEX   002CCCA7775777DC77777F7FF777F777
         HEX   A44DD777B2B22BB7A5DD45D400000000
         HEX   00000000000000000000000000000000
         HEX   000000000022000DDDDDCC7A77777CDC
         HEX   77777F7FF777F777A4AAD7777B22277B
         HEX   A5524522D00400000000000000000000
         HEX   00000000000000000000000002242DD5
         HEX   5CC7AA77777775C7777777FFF777F777
         HEX   7DAA7B7777222A77BBAAD5522DD00000
         HEX   00000000000000000000000000000000
         HEX   00000000024DDD5BBBBB5777AC7CAD77
         HEX   77BF77FFF777F7777BADABBB777B44A7
         HEX   77BA2D555DD002000000000000000000
         HEX   000000000000000000000000024AA5CB
         HEX   B77557775CCAD577777777FFF777FF77
         HEX   7BBAACBB777724AC77BC5DD455D00220
         HEX   00000000000000000000000000000000
         HEX   000000020445AAB772577777C75DD777
         HEX   777777FFF777F7FF77BB77CB77777DA7
         HEX   777BAA54445D00200000000000000000
         HEX   0000000000000000020000024447CB72
         HEX   5557777C57DD7C777F777FFFF7F7F77F
         HEX   777A777C7777C77AC777CAA5542DD22D
         HEX   00000000000000000000000000000000
         HEX   20000002444ABB755577775C77577777
         HEX   FF777FFFF7F7F777777777777B7B777A
         HEX   C7777CA55525252D2000000000000000
         HEX   00000000000000002000000D44ACC7A5
         HEX   57F777C77F7777FFF777FFFFF7F7F77F
         HEX   F77A7A77CC777777AC77BBBA55D4245D
         HEX   22000000000000000000000000000002
         HEX   202222DACCCB7C777777757F777777FF
         HEX   777F7FFFF7F7F777F7777A7777B7B7D7
         HEX   AAAC77B7CCADD4A2D200000000000000
         HEX   0000000000000002AD222DAC5BBCC777
         HEX   7B77757F7777777F777F7FF7F7F7F777
         HEX   FF7777A7B7B7FA7D7AAC77777CCADD25
         HEX   D2000000000000000000000000000022
         HEX   DA555ACBB77777F7B7755A77777B7FFF
         HEX   77F77FF7F7F7F7777F77C777FA777DAA
         HEX   7777C77ABB7CA5545D20000000000000
         HEX   000000000000022D555ACAB77A777777
         HEX   7775A7F777BB7FF777F77F77F7FFF777
         HEX   77F77C777FA77775C777777777BCCA7D
         HEX   4AA00220000000000000000000000224
         HEX   AACDD77A77A777B777F77F777A77F777
         HEX   F7F7FFF7F7FFF7F777FF7C77FF7AB777
         HEX   5A77777777722A4AA55A202000000000
         HEX   00000000000022A4ACCBB7777777BBC7
         HEX   7F777F77B577FF7F7777FFF7F7FFF77F
         HEX   777F77C77F77DB775A77C777777AAAA2
         HEX   A55A422000000000000000000000245A
         HEX   CCA7777A7777C5B7FF7FF7C2B7FFF7FF
         HEX   7F77FFF7F7FFF77FF77FF77CF7774477
         HEX   7AA77BC777B77BB22452AA2200000000
         HEX   0000000000D24A5A2AD77777775BA77F
         HEX   FFFF77A777FF777FFFFFFFF7F7FFF77F
         HEX   F777F77CC7FF7CAB745A77BDA77B777C
         HEX   BB442A4422000000000000000DD44A7A
         HEX   AD77577775AB777FFFF77777FFF7777F
         HEX   FF77FFF7F7FFF77FF777F77C277F77A7
         HEX   A44A777DDA7D7B77CBBA442220000000
         HEX   00000000D52477A2D77557755A77FFFF
         HEX   FFFF77FFFF77FFFF7F7FFFF7F7FFF7FF
         HEX   FF7F7F77CC7FF7C77AA4F77DDDD777B7
         HEX   77BCAAAAD202200000002000DA547AA7
         HEX   77577757577FFFFFFFFFFFFFF77FF7FF
         HEX   7FF7FFFFF7FFFF77FFF77FFF777FFFCC
         HEX   777AFFFCB4DA7775777BCAA54D002200
         HEX   00002000DD547AAA75577757777FFFFF
         HEX   FFFFFFFF7FFF777F7FFFFFFFF7FFFFEE
         HEX   EEFFFFFF77F7FF7C77C777FACA4AA775
         HEX   5A77BCAA542022000002000000DC7777
         HEX   55777757777FFFFFFEFFFFFFF7FFFFFF
         HEX   FFFFEFFFF7FFFEFFFEEEF77FFFF77FF7
         HEX   7777A777BAA44A7755A777CA55D22200
         HEX   0002200002DC7F77FFFFEEE7777EFFFF
         HEX   FFFEFFF7F7FFFEF77FEFFFFFFEFFEFFF
         HEX   FEFFEFF7EFFF7FFFF77777EFFF7BBBBF
         HEX   F77CC77CA54D42200000200222CB7F7E
         HEX   FFFFFFEF777FFFFFFFFEEF7FFFEEFF17
         HEX   7EFFFFFFFFEFFFFFF1FFEF7EFFFFEEFF
         HEX   7F77EEEFFFF7BB77F77CAC7AAA4D2220
         HEX   00022222CBB7FFEFFFFFFFFEFFFFFFFF
         HEX   FFFEEFFFEFFF3E6F3EFFFFFFFFEFFFFF
         HEX   F6FFFEFFFFFFFFEE7FFEFFFFFFFFE777
         HEX   FF77CC7BBB52222000224BB777777FF6
         HEX   F137FFFEFFE6EF761EFEEFFEFFFF176F
         HEX   3EEFE667F6FEFFFFFF67FEFFFFFFFFEE
         HEX   F7FEFFFFFFFFEFF7FFFF77C7BB552220
         HEX   0244B7777EEEE1FF6FFFFEEEEEEF676F
         HEX   FFEFFFFEFFFF66F1FFEEFFF67F1FFEFF
         HEX   F6FFEF6E7661FEEEEEEEEFE667F6FEFE
         HEX   EEE777777B554220024C7777EEEEEE1F
         HEX   76F77EEEEEEEFFF1777FFFFEFFFF71FF
         HEX   FFFFF1FFFEFFFFEEEFF17FFEFFFFEEEE
         HEX   EEEEEEFFFF6FF1EEEEEFF7777B555220
         HEX   25CB777FEFFFEEEFFFF7FEEFFFFE7EFF
         HEX   FFEEEEEEEFFFFFFFFFEEEFFFFFFFFFFF
         HEX   FFFFFEEEFFFF77EFFFFFEFFFFFFEEEFF
         HEX   FFFEFF777755522025CB77FFF17EFFFF
         HEX   FFFFEFF7FFFEFFFFFFFFEEFFFEEEEFFF
         HEX   FFF1FE6FFFFEEE6FFFFEEFFFFFFFFEFF
         HEX   FF71FEFFFFFFFFEFF717FFF777A55200
         HEX   2CCB77F1F66EFFFFFFFFEFF6FFFEFFFF
         HEX   FFFFEFFFFFEEEFFFFFFEFEF761EFEEF7
         HEX   61EFEEFFFFFFFEFFFF66FEFFFFFFFFEF
         HEX   F66F1FF777A52200255B773FF71EFFF7
         HEX   31F6F6F1FFFF63F367FFEE631F6FF6F1
         HEX   36FFEFFFFFFFFEFFFFFFFEFF631F6FFF
         HEX   FF176F6F136FFFEFF176F377AAA22200
         HEX   25557F3FEE3FEEFFFF6FF1E3FFFFFE6F
         HEX   FFFEEFFFF6F1FF6FFFFEEFFFFFFFFEFF
         HEX   FFFFFEEFFFF6FF1FFF3E1FF6FFFFEEEF
         HEX   F3E6F3775522000025555FEEF66FEEFF
         HEX   F67F1FF6FFF1F67FFFFEEFFF67F11F76
         HEX   FFFEEFFFFFFFEFFFFFFFEEEFFF67F1FE
         HEX   FF66F1F76FFFEEEFF66FEE7555200000
         HEX   002222741E777777E1EE77177777E1EE
         HEX   7777777E1EE77EE1E777777FFFE7777F
         HEX   FFE777777E1EE777777E77EE1E777777
         HEX   77E7777442000000005BB5

L5510    DW    $0000
L5512    DW    $0000
L5514    DW    $0000
L5516    DW    $0000
L5518    DW    $0000
L551A    DW    $0000
L551C    DW    $0000
L551E    DW    $0000
L5520    DW    $0000

L5522    DB    $01
L5523    DB    $00

L5524    DB    $04
L5525    DB    $00
         DA    $77F0
L5528    DW    $0000
         DW    $0000

L552C    DB    $03
         DA    L297B
         DA    $1000
L5531    DB    $00
         DB    $00

L5533    DB    $07
         DA    L297B
         DB    $C3
         DB    $06
         DW    $0000
         DB    $01
         DW    $0000
         DW    $0000

L553F    DB    $01
         DA    L297B

L5542    DB    $01
L5543    DB    $00

L5544    DB    $04
L5545    DB    $00
L5546    DA    $5800
L5548    DW    $4000
L554A    DW    $0000

L554C    DB    $03        ; open call
L554D    DA    $0200      ; pointer to filename
         DA    $0900
L5551    DB    $00

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

MessagePosté le: Dim 31 Mai 2015, 22:12    Sujet du message: Répondre en citant

This is the PROTECTION.S file. The entry points at $58A3 (check for the original disk) and $5995 (check the result values)

Code:

*
* Rastan
* (c) 1990, Taito
*
* This is the protection code
* compressed in RASTAN2
* uncompressed at $00/5800
*

         TYP   BIN
         ORG   $005800
         lst   off

*--- Equates

SLTROMSEL EQU  $C02D
DISKREG  EQU   $C031
CYAREG   EQU   $C036
VERSION  EQU   $FBB3
ZIDBYTE  EQU   $FBC0
IDROUTINE EQU  $FE1F

*--- First call is at $58A3
*--- The second is at $5995

*--- This is a direct page!

L5800    DB    $00        ; 00
         DB    $0C        ; 01
         DB    $07        ; 02
         DB    $03        ; 03
         DB    $09        ; 04
         DB    $00        ; 05
         DB    $00        ; 06
         DB    $03        ; 07
         DB    $00        ; 08
         DB    $0C        ; 09
         DB    $58        ; 0A
         DB    $03        ; 0B
         DB    $00        ; 0C
         DB    $00        ; 0D
         DB    $00        ; 0E
         DB    $00        ; 0F
         DB    $00        ; 10
         DB    $00        ; 11
         DB    $00        ; 12
         DB    $00        ; 13
         DB    $00        ; 14
         DB    $00        ; 15
         DB    $00        ; 16
         DB    $00        ; 17
         DB    $00        ; 18
         DB    $00        ; 19
         DB    $00        ; 1A
         DB    $00        ; 1B
         DB    $00        ; 1C
         DB    $00        ; 1D
         DB    $00        ; 1E
         DB    $00        ; 1F
         DB    $00        ; 20
         DB    $00        ; 21
         DB    $00        ; 22
         DB    $00        ; 23
         DB    $00        ; 24
         DB    $00        ; 25
         DB    $00        ; 26
         DB    $50        ; 27
         DB    $01        ; 28
         DB    $03        ; 29
         DB    $05        ; 2A
         DB    $00        ; 2B
         DB    $03        ; 2C
         DB    $20        ; 2D
         DB    $01        ; 2E
         DB    $00        ; 2F
         DB    $00        ; 30
         DB    $00        ; 31
         DB    $00        ; 32
         DB    $00        ; 33
         DB    $00        ; 34
         DB    $00        ; 35
         DB    $00        ; 36
         DB    $00        ; 37
         DB    $00        ; 38
         DB    $00        ; 39
         DB    $00        ; 3A
         DB    $03        ; 3B
         DB    $00        ; 3C
         DB    $40        ; 3D
         DB    $58        ; 3E
         DB    $00        ; 3F
         DB    $00        ; 40
         DB    $00        ; 41
         DB    $00        ; 42
         DB    $00        ; 43
         DB    $03        ; 44
         DB    $00        ; 45
         DB    $49        ; 46
         DB    $58        ; 47
         DB    $06        ; 48
         DB    $02        ; 49
         DB    $00        ; 4A
         DB    $00        ; 4B
         DB    $05        ; 4C
         DB    $03        ; 4D
         DB    $00        ; 4E
         DB    $52        ; 4F
         DB    $58        ; 50
         DB    $05        ; 51
         DB    $06        ; 52
         DB    $00        ; 53
         DB    $00        ; 54
         DB    $00        ; 55
         DB    $00        ; 56
         DB    $04        ; 57
         DB    $00        ; 58
         DB    $05        ; 59
         DB    $03        ; 5A
         DB    $00        ; 5B
         DB    $5F        ; 5C
         DB    $58        ; 5D
         DB    $05        ; 5E
         DB    $04        ; 5F
         DB    $00        ; 60
         DB    $00        ; 61
         DB    $00        ; 62
         DB    $00        ; 63
         DB    $00        ; 64
         DB    $00        ; 65
         DB    $00        ; 66
         DB    $FE        ; 67
L5868    DB    $00        ; 68
         DB    $00        ; 69
         DB    $00        ; 6A
         DB    $00        ; 6B
         DB    $00        ; 6C
         DB    $00        ; 6D
         DB    $00        ; 6E
         DB    $00        ; 6F
         DB    $D5        ; 70
         DB    $AA        ; 71
         DB    $D5        ; 72
         DB    $62        ; 73
         DB    $02        ; 74
         DB    $00        ; 75

*--- The direct page values from an original disk
*--- Use it to compare, the first $3A bytes differ
*--- And the four next bytes are used to check
*--- if we have an original disk or a copy

* $01: 00 / was 0C
* $02: 00 / was 07
* $03: 01 / was 03
* $04: 02 / was 09

         HEX   0000000102500203030C5803FC400600
         STR   'DISK 3.5'
         ASC   '       '
         HEX   2001C000300003500103050003200100
         HEX   00CA010500BFACAAAB84820300405800
         HEX   00000000030049580602000005030052
         HEX   5805060000000004000503005F580504
         HEX   00000000000000FE0000000000000000
         HEX   D5AAD5620200

*--- The code starts here

         MX    %11

L5876    BRL   L59D5
         PEA   $0000
         PLD
         LDX   #$00
         LDA   VERSION
         CMP   #$06
         BNE   L5896
         INX
         LDA   ZIDBYTE
         BEQ   L5896
         SEC
         JSR   IDROUTINE
         LDA   #$00
         ROR
         EOR   #$80
         TAX

L5896    PER   L5800      ; push word
         PLD              ; pull in D
         STX   $00
         LDA   $31
         STA   $04
         BRL   L59EF

*--- The entry point 1: check the disk & call the protection
*
* To understand the PER instruction
* read Eyes' & Lichty's Programming the 65816
* published by Brady. Read page 407
*

* CALL 1
         MX    %11

L58A3    PER   L58A9-1    ; push
L58A6    BRL   L59D5      ; GO

* CALL 3

L58A9    LDA   #$01       ; init some values on the DP
         STA   $26
         LDA   $27        ; #$50 (slot 5)

L58AF    STA   $05
         LSR
         LSR
         LSR
         LSR
         ORA   #$C0
         STA   $02        ; #$C5
         LDA   $28        ; #$01
         STA   $06
         LDA   #$00       ; #$C500
         STA   $01
         LDX   #$05
L58C3    LDY   $29,X      ; 03 05 00 03 20 01
         LDA   ($01),Y    ; 01
         DEX
         CMP   $29,X      ; C501=20
         BNE   L5929      ; C503=00
         DEX              ; C505=03
         BPL   L58C3

         LDY   #$FF
         LDA   ($01),Y    ; $C5FF (0A)
         BEQ   L5929      ; next slot
         CMP   #$FF
         BEQ   L5929      ; next slot
         ADC   #$03       ; add 3 for smartport entry
         TAX              ; move to X

         LDY   #$07
         LDA   ($01),Y    ; C507 (00)
         BNE   L5929      ; next slot
         LDY   #$FB
         LDA   ($01),Y    ; C5FB (C0)
         AND   #$03
         BNE   L5929      ; next slot

         STX   $01        ; we have 0D in $01
         LDA   $28        ; we have 01
         STA   $08        ; we save at $08

L58F0    PER   L58F6-1    ; save next address
L58F3    BRL   L59A8      ; next call

* CALL 5

L58F6    DB    $00
         DB    $07

         CLI
         PER   L5800
         PLD
         INC   $01
         BCC   L5907
         LDA   #$01
         STA   $08
         BNE   L5921
L5907    LDA   $21
         CMP   #$01
         BNE   L591F
         LDA   $22
         BEQ   L593C
         LDA   $26
         STA   $06
         INC   $26
         PER   L591A+2
L591A    BRL   L59FA
         BCC   L5939
L591F    INC   $08
L5921    LDA   $08
         STA   $06
         CMP   $28
         BNE   L58F0

L5929    LDA   $05        ; next slot! (50..40..)
         SEC
         SBC   #$10
         BNE   L5932
         LDA   #$70       ; slot 7
L5932    CMP   $27        ; same slot?
         BEQ   L5939      ; yep
         BRL   L58AF      ; loop
L5939    BRL   L59EF      ; exit!

*

L593C    PER   L593F+2
L593F    BRL   L5C1D
         BCS   L591F
         BRL   L59EF

         DB    $07

         CLI
         PER   L594C+2
L594C    BRL   L59D5
         PER   L5CBE
         PLD
         LDX   $00
         PER   L5800
         PLD
         PEI   $01
         STZ   $01
         PER   L5E40
         PLA
         STA   $2F
         PLA
         STA   $30
         PER   L5868
         PLY
         PLA
L596B    STA   $02
         CMP   $30
         BEQ   L597E
         TXA
L5972    EOR   ($01),Y
         INY
         BNE   L5972
         TAX
         LDA   $02
         ADC   #$01
         BCC   L596B
L597E    TXA
         BCS   L5982
L5981    INY
L5982    EOR   ($01),Y
         CPY   $2F
         BNE   L5981
         PLY
         STY   $01
         PLY
         STY   $02
         PER   L5800
         PLD
         BRL   L59EF

*--- The entry point 2: the protection check

L5995    PER   L599B-1    ; protection check
L5998    BRL   L59D5      ; first init things

L599B    LDA   $01
         CLC
         ADC   $02
         ADC   $03
         ADC   $04
         SBC   #$0E
         BCC   L59EF

* CALL 4

L59A8    DEC   $01        ; from 0D
         PEI   $01        ; to 0C
         PEA   $0000      ; 0000
         PLD              ; as new DP
         RTS              ; return

         PER   L5800
         PLD
         RTS

         ASC   "Copyright 1988, NovaLogic, Inc."

* CALL 2

L59D5    CLC              ; switch to 16-bit
         XCE
         REP   #$30
         PLA              ; the return address
         PHD              ; save D
         PHB              ; save B
         PHK              ; set K
         PLB              ; so set B
         STA   $013E      ; save the return address

         PER   L5800      ; push $5800
         PLD              ; set as direct page
         TSC              ; save the stack pointer
         STA   $31
         LDA   #$013D     ; force stack
         TCS              ; put its pointer
         SEC
         XCE
         RTS              ; and go to it...

*--- The exit point

L59EF    XCE              ; go to 16-bit
         CLC
         XCE
         REP   #$30
         LDX   $31        ; restore the stack pointer
         TXS
         PLB              ; restore B
         PLD              ; restore D
         RTL              ; return

*---

L59FA    PER   L59FD+2
L59FD    BRL   L5A0F
         PER   L5A03+2
L5A03    BRL   L5AF7
         PHP
         PER   L5A0A+2
L5A0A    BRL   L5BB6
         PLP
         RTS

         MX    %11
L5A0F    LDA   CYAREG
         STA   $39
         AND   #$FB
         ORA   #$80
         STA   CYAREG
         LDA   SLTROMSEL
         STA   $3A
         AND   #$9F
         STA   SLTROMSEL
         LDA   #$40
         STA   DISKREG
         LDY   #$0F
         LDA   $C0E8
         LDA   $C0ED
         BRA   L5A38
L5A34    TYA
         STA   $C0EF
L5A38    TYA
         EOR   $C0EE
         AND   #$1F
         BNE   L5A34
         LDA   $C0EC
         LDA   $C0E9
         LDX   $06
         LDA   $C0E9,X
         LDA   $C0E9
         RTS

L5A4F    PER   L5A52+2
L5A52    BRL   L5A70
         PER   L5A58+2
L5A58    BRL   L5AB1
         LDY   #$00
         LDA   #$00
         BEQ   L5A6F
         TAX
         TYA
         PER   L5A66+2
L5A66    BRL   L5BD4
         PER   L5A6C+2
L5A6C    BRL   L5A98
L5A6F    RTS

L5A70    LDA   #$01
         PER   L5A75+2
L5A75    BRL   L5BD4
         LDX   #$50
         PER   L5A7D+2
L5A7D    BRL   L5A98
         LDX   #$50
L5A82    LDA   #$07
         PER   L5A87+2
L5A87    BRL   L5ADA
         LDA   #$0A
         PER   L5A8F+2
L5A8F    BRL   L5BC7
         BPL   L5A97
         DEX
         BNE   L5A82
L5A97    RTS

L5A98    LDA   #$04
         PER   L5A9D+2
L5A9D    BRL   L5BD4
L5AA0    PER   L5AA3+2
L5AA3    BRL   L5BCD
         BPL   L5AA0
         DEX
         BNE   L5A98
         LDX   #$4F
L5AAD    DEX
         BNE   L5AAD
         RTS

L5AB1    LDA   #$08
         PER   L5AB6+2
L5AB6    BRL   L5BC7
         BPL   L5AD1
         PER   L5ABE+2
L5ABE    BRL   L5BDA
         LDA   #$19
         PER   L5AC6+2
L5AC6    BRL   L5AD2
         LDA   #$19
         PER   L5ACE+2
L5ACE    BRL   L5AD2
L5AD1    RTS

L5AD2    PHA
         PER   L5AD6+2
L5AD6    BRL   L5ADA
         PLA
L5ADA    STA   $34
         LDA   CYAREG
         PHA
         AND   #$7F
         STA   CYAREG
L5AE5    LDA   #$64
         STA   $33
L5AE9    DEC   $33
         NOP
         BNE   L5AE9
         DEC   $34
         BNE   L5AE5
         PLA
         STA   CYAREG
         RTS

L5AF7    LDA   #$02
         PER   L5AFC+2
L5AFC    BRL   L5BC7
         BPL   L5B03
         SEC
         RTS

L5B03    LDA   #$0C
         PER   L5B08+2
L5B08    BRL   L5BC7
         BPL   L5B15
         LDA   #$03
         PER   L5B12+2
L5B12    BRL   L5BD4
L5B15    PER   L5B18+2
L5B18    BRL   L5A4F
         LDA   #$00
         PER   L5B20+2
L5B20    BRL   L5BD4
         LDA   #$08
         PER   L5B28+2
L5B28    BRL   L5BC7
         BIT   $C0E7
         BIT   $C0E6
         PER   L5B34+2
L5B34    BRL   L5C0F
         LDA   #$01
         PER   L5B3C+2
L5B3C    BRL   L5BC7
         LDA   $C0EC
         LDA   $C0EC
         STZ   $33
L5B47    LDX   #$80
         LDY   #$00
L5B4B    LDA   $C0EC
         BPL   L5B4B
         CMP   $70
         BNE   L5BAE
L5B54    LDA   $C0EC
         BPL   L5B54
         CMP   $71
         BNE   L5BAE
L5B5D    LDA   $C0EC
         BPL   L5B5D
         CMP   $72
         BNE   L5BAE
         LDA   $33
         BEQ   L5B86
         LDX   #$03
         LDY   #$00
L5B6E    LDA   $C0EC
         BPL   L5B6E
         CMP   $35,X
         BNE   L5B79
         INC   $01,X
L5B79    DEX
         BPL   L5B6E
         INC   $33
         LDA   $33
         CMP   #$05
         BNE   L5B4B
         CLC
         RTS

L5B86    STZ   $01
L5B88    LDA   $C0EC
         BPL   L5B88
         STA   $38
         STZ   $02
L5B91    LDA   $C0EC
         BPL   L5B91
         STA   $37
         STZ   $03
L5B9A    LDA   $C0EC
         BPL   L5B9A
         STA   $36
         STZ   $04
L5BA3    LDA   $C0EC
         BPL   L5BA3
         STA   $35
         INC   $33
         BRA   L5B47
L5BAE    DEY
         BNE   L5B4B
         DEX
         BNE   L5B4B
         SEC              ; hum... read error!!!
         RTS

L5BB6    BIT   $C0E8
         STZ   DISKREG
         LDA   $3A
         STA   SLTROMSEL
         LDA   $39
         STA   CYAREG
         RTS

L5BC7    PER   L5BCA+2
L5BCA    BRL   L5BE1
L5BCD    BIT   $C0ED
         LDA   $C0EE
         RTS

L5BD4    PER   L5BD7+2
L5BD7    BRL   L5BE1
L5BDA    BIT   $C0E7
         BIT   $C0E6
         RTS

L5BE1    BIT   $C0E0
         BIT   $C0E3
         BIT   $C0E6
         BIT   $C0E4
         LSR
         BCC   L5BF3
         BIT   $C0E5
L5BF3    LSR
         PHA
         LDA   DISKREG
         AND   #$7F
         BCC   L5BFE
         ORA   #$80
L5BFE    STA   DISKREG
         PLA
         LSR
         BCC   L5C08
         BIT   $C0E1
L5C08    LSR
         BCS   L5C0E
         BIT   $C0E2
L5C0E    RTS

L5C0F    LDA   #$0B
         PER   L5C14+2
L5C14    BRL   L5BC7
L5C17    BIT   $C0EE
         BMI   L5C17
         RTS

L5C1D    LDA   $06
         STA   $3C
         STA   $45
         STA   $4E
         STA   $5B
         PER   L5CBE
         PLD
         STA   $00
         PER   L5800
         PLD
         LDX   #$02
L5C33    LDA   $70,X
         STA   $54,X
         DEX
         BPL   L5C33
         PER   L5C3D+2
L5C3D    BRL   L59A8
         BRK   $3B
         CLI
         PER   L5800
         PLD
         INC   $01
         BCC   L5C4C
         RTS

L5C4C    LDA   $40
         AND   #$10
         BNE   L5C54
         SEC
         RTS

L5C54    PER   L5C57+2
L5C57    BRL   L59A8
         TSB   $44
         CLI
         PER   L5800
         PLD
         INC   $01
         PER   L5C66+2
L5C66    BRL   L59A8
         TSB   $BD
         JMPL  $FB9162

         PLD
         INC   $01
         PER   L5C75+2
L5C75    BRL   L59A8
         TSB   $4D
         CLI
         PER   L5800
         PLD
         INC   $01
         PER   L5C84+2
L5C84    BRL   L59A8
         DB    $00
         DB    $5A
         CLI
         PER   L5800
         PLD
         INC   $01
         LDA   $62
         BPL   L5C96
         SEC
         RTS

L5C96    AND   #$0F
         STA   $01
         LDA   $62
         LSR
         LSR
         LSR
         LSR
         STA   $02
         LDA   $63
         AND   #$0F
         STA   $03
         LDA   $63
         LSR
         LSR
         LSR
         LSR
         STA   $04
         RTS

         DB    $3B
         DB    $58
         DB    $44
         DB    $58
         DB    $BD
         DB    $5C
         DB    $4D
         DB    $58
         DB    $5A
         DB    $58
         DB    $C2
         DB    $5C
         DB    $03
L5CBE    DB    $00
         DB    $C2
         DB    $5C
         DB    $07
         DB    $7C
         DB    $01

         MX    %11

         STA   $05BC
         STX   $05BD
         STY   $05BE
         STZ   $13
         LDA   #$00
         STA   $14
         JSR   $007B
         JSR   $0661
         CLC
         JSR   $05C8
         BCC   L5CE2
         LDA   #$FF
         RTS

L5CE2    JSR   $05FE
         JSR   $05EC
         STZ   $05BF
L5CEB    LDX   #$80
         LDY   #$00
L5CEF    LDA   $0A0E
         BPL   L5CEF
         CMP   $05BC
         BNE   L5D61
L5CF9    LDA   $0A0E
         BPL   L5CF9
         CMP   $05BD
         BNE   L5D61
L5D03    LDA   $0A0E
         BPL   L5D03
         CMP   $05BE
         BNE   L5D61
         LDA   $05BF
         BEQ   L5D30
         LDX   #$03
L5D14    LDA   $0A0E
         BPL   L5D14
         CMP   $05C0,X
         BNE   L5D21
         INC   $05C4,X
L5D21    DEX
         BPL   L5D14
         INC   $05BF
         LDA   $05BF
         CMP   #$05
         BNE   L5CEF
         BRA   L5D6A
L5D30    STZ   $05C4
L5D33    LDA   $0A0E
         BPL   L5D33
         STA   $05C3
         STZ   $05C5
L5D3E    LDA   $0A0E
         BPL   L5D3E
         STA   $05C2
         STZ   $05C6
L5D49    LDA   $0A0E
         BPL   L5D49
         STA   $05C1
         STZ   $05C7
         INC   $05BF
L5D57    LDA   $0A0E
         BPL   L5D57
         STA   $05C0
         BRA   L5CEB
L5D61    DEY
         BNE   L5CEF
         DEX
         BNE   L5CEF
         LDA   #$FF
         RTS

L5D6A    LDA   $05C7
         ASL
         ASL
         ASL
         ASL
         ORA   $05C6
         TAX
         LDA   $05C5
         ASL
         ASL
         ASL
         ASL
         ORA   $05C4
         RTS

         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         DB    $00
         MX    %11
         PHP
         LDX   #$01
L5D8F    LDA   $05EA,X
         JSR   $0615
         ASL
         ROR   $17
         DEX
         BPL   L5D8F
         PLP
         LDA   #$AF
         BIT   $17
         BVS   L5DA8
         BCC   L5DAB
         BMI   L5DAC
         LDA   #$AB
L5DA8    STA   $5E
         SEC
L5DAB    RTS

L5DAC    CLC
         RTS

         ASL   $02
         LDA   #$01
         BIT   $16
         BPL   L5DB8
         LDA   #$03
L5DB8    JSR   $0615
         LDA   $0A0C
         LDA   $0A0E
         RTS

         LDA   #$0B
         JSR   $0615
L5DC7    BIT   $0A0E
         BMI   L5DC7
         LDA   $09
         AND   #$EF
         STA   $0800
         LDA   $09
         STA   $0800
         RTS

         JSR   $061F
         BIT   $0A0D
         LDA   $0A0E
         RTS

         BIT   $0A01
         BIT   $0A03
         BIT   $0A04
         LSR
         BCC   L5DF2
         BIT   $0A05
L5DF2    LSR
         PHA
         LDA   #$01
         BCC   L5DFA
         LDA   #$11
L5DFA    JSR   $0647
         PLA
         LSR
         BCS   L5E04
         BIT   $0A00
L5E04    LSR
         BCS   L5E0A
         BIT   $0A02
L5E0A    RTS

         PHX
         LDX   #$00
         PHA
         EOR   #$0F
         ORA   #$F0
         AND   $09,X
         STA   $09,X
         PLA
         LSR
         LSR
         LSR
         LSR
         ORA   $09,X
         STA   $09,X
         STA   $0800,X
         PLX
         RTS

         LDA   #$1F
         TAY
         LDA   $0A08
         LDA   $0A0D
L5E2E    STY   $0A0F
         TYA
         EOR   $0A0E
         AND   #$1F
         BNE   L5E2E
         LDA   $0A0C
         LDA   $0A09
         RTS

L5E40    DB    $63
         DB    $00
         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: 2895
Localisation: Le Chesnay, France

MessagePosté le: Dim 31 Mai 2015, 22:13    Sujet du message: Répondre en citant

And the final file, my patch for the game, located at $5560. It intercepts the MLI main vector.

Code:

*
* Rastan
* (c) 1990, Taito
* (k) 2015, LoGo
*
* This is part of the RASTAN.SYSTEM file
* which contains the changes to bypass
* the protection
* This is added to the end of the file
*

         mx    %00
         org   $5560
         lst   off

* Equates

PRODOS8  =     $BF00

* 1- Patch the ProDOS MLI dispatcher
*    Reset the original call to $020000

patchRASTAN1 stz $21b2    ; $0000
         lda   #$0200     ; $0002
         sta   $21b3      ; jmpl to $02/0000 reset

         lda   PRODOS8+1  ; we save the MLI address
         sta   patchMLI+1 ; for later use
         lda   #patchRASTAN2 ; we patch the MLI dispatcher
         sta   PRODOS8+1
         jmpl  $020000    ; and we jump to the game

         db    $00
         db    $00
         db    $00
         db    $00
         db    $00
         db    $00
         db    $00

* 2- Whenever we have a MLI call
*    we check if the file to load
*    is part of the protection call
*    If so, we'll patch the routine!

* This table from RASTAN.SYSTEM is a list
* of pointers to the file names

* L24FF ...
         DA    L2834      ; 6E <= index
         DA    L2847      ; 70
         DA    L285A      ; 72
         DA    L286D      ; 74
         DA    L2880      ; 76

* This list is the ProDOS filenames

* L2587 ...
L2834    STR   "RASTAN/RNDASHPDATA"
L2847    STR   "RASTAN/RND1SHPDATA"
L285A    STR   "RASTAN/RND2SHPDATA"
L286D    STR   "RASTAN/RND3SHPDATA"
L2880    STR   "RASTAN/RND4SHPDATA"

*--- Our code...

patchRASTAN2 php          ; switch to 16-bit
         clc
         xce
         rep   #$30
         lda   $554D      ; pointer to P8 filename
         cmp   #$2834     ; index 6E
         beq   patchYES
         cmp   #$2847     ; index 70
         beq   patchYES
         cmp   #$285A     ; index 72
         beq   patchYES
         cmp   #$286D     ; index 74
         beq   patchYES
         cmp   #$2880     ; index 76
         bne   patchNO

patchYES lda   #patchRASTAN3 ; patch the protection
         stal  $022001    ; because of the file index

patchNO  sec              ; now, we load the file
         xce
         sep   #$30
         plp
patchMLI jmp   $BDBD      ; hop, jump to P8

* 3- The following code replaces the protection
*    and then resets the pointer
*    If we do not, the game will hang!

         mx    %00

* We come here in 16-bit but program bank is not set

patchRASTAN3 lda #$58a3   ; We reset the protection
         stal  $022001    ; routine pointer

         lda   #$5002     ; We set the final values
         stal  $005804    ; to the direct page of the
         lda   #$0100     ; protection
         stal  $005802
         lda   #$0000     ; Those are checked by $00/5995
         stal  $005800
         clc              ; We exit and tell
         rtl              ; John everything went well!

         ds    \
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: 2895
Localisation: Le Chesnay, France

MessagePosté le: Dim 31 Mai 2015, 22:16    Sujet du message: Répondre en citant

I am writing the explanations of the crack while listening to episode 47.5 of Open-Apple (see http://www.open-apple.net/) which is an interview of John Brooks, the author of Rastan.

Now at 41:00, it appears that 1/ my thoughts about a checksum of the code is true and that 2/ my approach of patching the OS calls was also used by other crackers. We have the same ideas, I see Smile

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

MessagePosté le: Lun 01 Juin 2015, 19:24    Sujet du message: Répondre en citant

My cracking notes:

Code:
2/1B5D: string PLAYER 1 READY
called at 1A47

PLEASE INSERT DISK B
2C07

2/
1FE4   2474 (Y VAR, X 4, A 0)
2009      hum...
2048      00/22CB
2356      29AB (Y 84, X F, A 0)
236B      29AB (Y 86, X E, A 0)

1FE2: 90 06 (1FEA)
1FEA PROTECTION
2014 SUITE PROGRAMME

CHANGER LE 90 06 PAR 90 30

00/58A3
00/5995

PROTECTION FROM 5800 TO 5E42

RASTAN.SYSTEM 13651

MTR
BLOAD RASTAN.SYSTEM,A$2000,TSYS
21B2:60 55 00
5560:48 A9 90 30 8F E2 1F 02 68 5C 00 00 02
5560:48 A9 80 09 8F 04 20 02 68 5C 00 00 02
BSAVE RASTAN.SYSTEM,A$2000,TSYS,E$556F

47 MEANS 59EF
59A6:90 47 KO REBOOTS
59A6:80 47 OK ON A COPY

200F:22 95 59 00
200F:22 EF 59 00

MTR
BLOAD RASTAN.SYSTEM,A$2000,TSYS
21B2:60 55 00
5560:48 A9 EF 59 8F 10 20 02 68 5C 00 00 02
BSAVE RASTAN.SYSTEM,A$2000,TSYS,E$556F

SEGMENT 2 : D227
SEGMENT 3 : FFEF

DIFFERENCE EN $5800 DE $5800 ŕ $583A INCLUS
ON PATCHE 02/2000 (JSL) POUR LE FAIRE RECOPIER LA DP
ON SORT AVEC CLC
DONE
02/2000: 22 A3 58 00

Just say NO to piracy...
It's killing the GS market
DEAD

WE WILL MODIFY THE CHECK OF THE PROTECTION AT 2010
OU SINON
2009: 22 07 2C 00 PAR 22 MAROUTINE 00
200D:80 F1 PAR 80 00

1FDE: 22 74 24 00 -> REDIRECT TO MYLOAD
2000: 22 A3 58 00 -> REDIRECT TO OK
THAT STILL DOES NOT WORK

WHAT IF WE MODIFY THE 2474 CALL DIRECTLY OR THE MLI CALL?
A=0
X=4
Y=6E 6E 70 6E 6E 72 6E 6E 74 6E 6E 76

24FF,Y EQUALS FILE TO LOAD
2834
2847
285A
286D
2880
THE FILENAME POINTER IS STORED AT $554D

2489:A9 00 40 -> change the pointer
GO THROUGH THE MLI THEN GRRR, STILL DOES NOT WORK

SO WE'LL PATCH THE MLI VECTOR DIRECTLY

OH... THAT WORKS
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
JohnBrooks



Inscrit le: 01 Juin 2015
Messages: 4
Localisation: SF Bay area

MessagePosté le: Lun 01 Juin 2015, 21:41    Sujet du message: Répondre en citant

toinet a écrit:
And the final file, my patch for the game, located at $5560. It intercepts the MLI main vector.


Nicely done.

If you have time and want an extra challenge:

1) Remove the code checksum so the OS does not need to be patched

2) Find the backdoor. I intentionally put in a backdoor so the protection could be disabled (and development cheat codes added) without modifying the game executables or loading any additional files or modifying the OS before Rastan itself was run. While developing and testing Rastan I didn't want to wait for the protection check code every time I assembled and tested the game, so I had 'built-in' support for removing compression and also adding things like invincibility, jump to level, that kind of thing. I don't think anyone has found the back door yet though. Probably because they never expected one.

It's great to see you digging into these long-hidden programming tricks and secrets!

-JB
_________________
Programmed on/for:
Apple ][+ '79, ][e '83, ][GS '86, SNES '90
Mac //fx '90, Quadra 900 '91, Q900 601 PPC '94, PB G3 '97, PB G4 '01, MBP '06, rMBP '12
SNES, Genesis, PSX, Dreamcast, PS2, Xbox, PS3, Xbox 360, PS4, Xbox One, PC, Linux
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


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

MessagePosté le: Mar 02 Juin 2015, 8:28    Sujet du message: Répondre en citant

Challenge accepted, John.
I already started the disassembly of the code segments.
As far as the backdoor is concerned, I have an idea, I found some weird comparisons in the code.

More to come later...

Antoine
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: Mar 02 Juin 2015, 17:07    Sujet du message: Répondre en citant

I was hoping to cheat and find it within the publicly available source code, but alas, it's not there.
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: Mar 02 Juin 2015, 22:40    Sujet du message: Répondre en citant

Checksum routine lives at 3/CA37.
It's called from several places in the code.
It sums a bit at a time, between frames of the graphics, which is why it doesn't fail right away.
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: Mar 02 Juin 2015, 22:59    Sujet du message: Répondre en citant

Here's mine:
5560: LDA #$0d80 ;always pass protection (BRA $+$0F)
5563: STA $22004
5567: LDA #$1780 ;always pass checksum (BRA $+$19)
556A: STA $3CAD0
556E: JMP $20000

I haven't found the backdoor yet, but two decompressors in rastan.system.
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: Mer 03 Juin 2015, 6:09    Sujet du message: Répondre en citant

Backdoor lives at 0/213F in RASTAN.SYSTEM.

Code:
213F                 PHY
2140                 LDX     loc_2187,Y ;table of handlers (move or decompress)
2143                 LDA     loc_216B,Y ;table of segment/size pairs
2146                 BEQ     loc_2190 ;end of list, restore values and run 2/0000.
2148                 BPL     loc_2173 ;regular handler
214A                 CMP     #$E000 ;signed value, but not the special case
214D                 BCS     loc_2173 ;regular handler
;one special case: used to prompt for side B
214F                 STX     loc_2160+1
2152                 XBA
2153                 AND     #$7F
2156                 TAX
2157                 LDA     loc_216A,Y
215A                 AND     #$FF00
215D loc_215D:
215D                 PHX
215E                 PHA
215F                 PHY
2160 loc_2160:
2160                 JSL     decompressfile ;self-modified
2164                 BCC     loc_216E
2166                 JSR     promptdisk
2169                 PLY
216A                 PLA
216B                 PLX
216C                 BRA     loc_215D
216E loc_216E:
216E                 PLY
216F                 PLA
2170                 PLX
2171                 BRA     loc_218A
;regular handler
2173 loc_2173:
2173                 STX     loc_2181+1
2176                 XBA
2177                 AND     #$FF
217A                 TAX
217B                 LDA     loc_216A,Y
217E                 AND     #$FF00
2181 loc_2181:
2181                 JSL     decompressfile ;self-modified
2185                 BCC     loc_218A
2187                 JMP     loc_2D85
218A loc_218A:
218A                 PLY
218B                 INY
218C                 INY
218D                 JMP     loc_213F


This is the table of segment/size pairs and their corresponding handlers. The high byte (e.g. $E0) is the segment, the low byte is the number of pages to write (i.e. $30==$3000 bytes, and $00==64kb).

Code:
21B5                 .WORD $E030 ;RASTAN/TITLE (stored)
21B7                 .WORD $E020 ;RASTAN/BONFIRE (stored)
21B9                 .WORD $E044 ;RASTAN/THRONE (compressed)
21BB                 .WORD $E059 ;RASTAN/ENDPIC1 (stored)
21BD                 .WORD $E062 ;.RASTAN/ENDPIC2 (stored)
21BF                 .WORD $E06B ;RASTAN/ENDPIC3 (stored)
21C1                 .WORD $E074 ;RASTAN/ENDPIC4 (stored)
21C3                 .WORD $E07D ;RASTAN/ART (compressed)
21C5                 .WORD $200 ;RASTAN/RASTAN1 (compressed)
21C7                 .WORD $300 ;RASTAN/RASTAN2 (compressed)
21C9                 .WORD $E00 ;RASTAN/COIN (compressed)
21CB                 .WORD $700 ;RASTAN/SOUND1 (compressed)
21CD                 .WORD $82D4 ;RASTAN/SOUND4 (compressed), this one is on side B
21CF                 .WORD 0
21D1                 .WORD movefile
21D3                 .WORD movefile
21D5                 .WORD decompressfile
21D7                 .WORD movefile
21D9                 .WORD movefile
21DB                 .WORD movefile
21DD                 .WORD movefile
21DF                 .WORD decompressfile
21E1                 .WORD decompressfile
21E3                 .WORD decompressfile
21E5                 .WORD decompressfile
21E7                 .WORD decompressfile
21E9                 .WORD decompressfile


So we can see that if all "decompresfile" were replaced with "movefile" then no decompression would happen. It would then be trivial to disable the protection code or to add anything of interest.
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: 2895
Localisation: Le Chesnay, France

MessagePosté le: Sam 06 Juin 2015, 9:03    Sujet du message: Répondre en citant

Yes! You did it, Peter! Congratulations! The first real crack of Rastan... in 2015! I was disassembling the code for you to play with it but you did not need it.

I would have 1/ skipped the entire protection call and put the BRA at the SEI level and 2/ stopped the checksum routine at the entry of the routine. The game would have been a little faster, so, probably not as genuine as you wanted it to be.

@John: will you post the entire source code someday?

Antoine
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: Dim 07 Juin 2015, 5:13    Sujet du message: Répondre en citant

Yes, I considered that approach, but I wanted to patch only existing branches, not to destroy the code by overwriting arbitrarily.
In cases like this, I favour aesthetics over performance. :-)
Besides, disabling the checksum routine to increase the speed might have unintended side-effects within the gameplay.
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
Aller ŕ la page 1, 2  Suivante
Page 1 sur 2

 
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