Index du Forum
IDENTIFICATION SERVEUR : 10.14.20.35 - CLIENT : 3.237.186.116

 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 

Le routine CHECKMEM de EDD 4
Aller à la page 1, 2  Suivante
 
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> Recherches techniques (hard ou soft)
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Lun 04 Fév 2008, 7:37    Sujet du message: Le routine CHECKMEM de EDD 4 Répondre en citant

je suis en train d'étudier la routiner CHECKMEM ($1F00-$20FF) d'EDD 4.
Cette routine est utilisée dans la partie centrale du code ($0C00-$17C5) et lors des options 3 et 7 (drive speed et examen des drives).

J'ai compris que le programme dessait une cartographique de l'apple II à la recherche des controllers disk II, qu'il recherchait le modèle de l'apple et sa mémoire (banks et aux) dans le but (probable) de virer les potentielles routines d'intrusion et de hack (bank 2) et (je n'ai pas fini) peut-être un auto check du code du programme EDD pour vérifier qu'il n'y a pas eu d'altération.

Mon soucis c'est que j'ai l'impression que ce code a été altéré (partiellement désactivé/induit en erreur) lors des cracks et je n'ai pas une version complète pour vraiment l'analyser sans erreur (il y a par exemple des bouts de code qui sont appelés nulle part, ce que je trouve louche).

Est-ce que quelqu'un (JPL par ex) aurait une version non altérée de ce code?

Merci pour vos réponses.

JM
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
JPL
Site Admin


Inscrit le: 12 Mar 2007
Messages: 165
Localisation: Issy les Moulineaux / PARIS

MessagePosté le: Lun 04 Fév 2008, 21:00    Sujet du message: Répondre en citant

je te passe la version source ce soir
Amitiés
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Envoyer un e-mail Visiter le site web de l'utilisateur
toinet
Site Admin


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

MessagePosté le: Mar 05 Fév 2008, 12:41    Sujet du message: Répondre en citant

Je ne vois pas de code non appelé dans cette zone mémoire. Les checks sont copiés en $80 puis exécutés. On peut s'interroger sur le LDA $72 du début...

Code:

*
* EDD 4.2
*

         ORG   $xxxx
         MX    %11
         LST   OFF

*
*
*

RDMAINRAM EQU  $C002
RDCARDRAM EQU  $C003
WRMAINRAM EQU  $C004
WRCARDRAM EQU  $C005
RDC3ROM  EQU   $C017
RDBANK2  EQU   $C080
RDROM2   EQU   $C082
LCBANK2  EQU   $C083

VERSION  EQU   $FBB3

*

L0800    =     $0800  ; zone de l'écran
L0C00    JMP   L0C18  ; pgm main entry point

*

L1F00    LDA   $72
         LDY   #$34
         JSR   L2036
         LDY   $18
         JSR   L2025

L1F0C    JMP   L1F27

L1F0F    JSR   L1F4F
         STA   L1F0F+1
         STA   L1F86+4
L1F18    JSR   L1F91
         STY   L1F18+1
         JSR   $0080
         STX   $90
         STX   L2036+1
         RTS

L1F27    JSR   L1F4F
         CMP   L1F86+4
         BNE   L1F4B
         JSR   L1F98
         JSR   $0080
         BCS   L1F4B
         LDA   LCBANK2
         LDA   LCBANK2
         LDY   #$00
L1F3F    TYA
         STA   $D000,Y
         INY
         BNE   L1F3F
         LDA   RDROM2
         RTS
         RTS

L1F4B    LDA   RDROM2
         DB    $02

L1F4F    LDA   #$C7
         STA   $01
         LDA   #$00
         STA   $00
         STA   L1F86
L1F5A    LDY   #$07
L1F5C    LDA   ($00),Y
         CMP   L1F86,Y
         BNE   L1F7A
         DEY
         DEY
         BPL   L1F5C
         LDA   $01
         AND   #$07
         TAY
         LDA   #$01
         BNE   L1F71
L1F70    ASL
L1F71    DEY
         BPL   L1F70
         ORA   L1F86
         STA   L1F86
L1F7A    DEC   $01
         LDA   $01
         CMP   #$C0
         BNE   L1F5A
         LDA   L1F86
         RTS

L1F86    HEX   FF20FF00FF03FF3C

L1F8E    DB    $77
L1F8F    DB    $77
L1F90    DB    $77

L1F91    LDA   #>L2025
         LDX   #<L2025
         JMP   L1F9C

L1F98    LDA   #>L1FAB
         LDX   #<L1FAB
L1F9C    STA   $01
         STX   $00
         LDY   #$00
L1FA2    LDA   ($00),Y
         STA   |$0080,Y
         INY
         BPL   L1FA2
         RTS

L1FAB    LDX   #$00
         LDA   L1F8E
         CMP   VERSION
         BNE   L201D
         CMP   #$06
         BNE   L1FFE
         LDA   RDC3ROM
         AND   #$80
         CMP   L1F8F
         BNE   L201D
         TAY
         BMI   L1FFE
         LDA   L0C00
         STA   RDCARDRAM
         STA   WRCARDRAM
         CMP   L0C00
         BEQ   L1FEF
         TAY
         EOR   #$FF
         CMP   L0C00
         BNE   L201D
         CMP   L0800
         BNE   L201D
         STY   L0800
         CPY   L0C00
         BNE   L201D
         STA   L0800
         SEC
         BCS   L1FF8
L1FEF    EOR   #$FF
         CMP   L0800
         BNE   L201D
         LDX   #$80
L1FF8    STA   RDMAINRAM
         STA   WRMAINRAM
L1FFE    LDA   RDBANK2
         LDY   #$00
L2003    TYA
         CMP   $D000,Y
         BNE   L200C
         INY
         BNE   L2003
L200C    PHP
         LDA   RDROM2
         TXA
         PLP
         BNE   L2016
         ORA   #$01
L2016    CMP   L1F90
         BNE   L201D
         CLC
         RTS

L201D    SEC
         STA   RDMAINRAM
         STA   WRMAINRAM
         RTS

L2025    STA   RDMAINRAM
         STA   WRMAINRAM
         LDA   RDROM2
         LDA   #$00
         STA   L1F90
         LDA   VERSION
         
L2036    STA   L1F8E
         CMP   #$06
         BNE   L206D
         LDA   RDC3ROM
         AND   #$80
         STA   L1F8F
         BMI   L206D
         LDA   L0C00
         STA   L0800
         STA   RDCARDRAM
         STA   WRCARDRAM
         STA   L0C00
         LDX   #$80
         EOR   #$FF
         STA   L0800
         CMP   L0C00
         STA   RDMAINRAM
         STA   WRMAINRAM
         BNE   L206A
         LDX   #$00
L206A    STX   L1F90
L206D    LDA   LCBANK2
         LDA   LCBANK2
         LDY   #$00
L2075    TYA
         STA   $D000,Y
         INY
         BNE   L2075
L207C    TYA
         CMP   $D000,Y
         BNE   L2085
         INY
         BNE   L207C
L2085    PHP
         LDA   RDROM2
         PLP
         BNE   L2094
         LDA   #$01
         ORA   L1F90
         STA   L1F90
L2094    RTS
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Mar 05 Fév 2008, 14:25    Sujet du message: Répondre en citant

Le point d'entrée de CHECKMEM se fait en $1F0C.
Donc pas d'appel de $1F00.
J'ai vu après publication du message dans un source à JPL que $1F0F était appelé depuis le boot 2.

JM
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Mar 05 Fév 2008, 14:27    Sujet du message: Répondre en citant

toinet a écrit:

Code:


L1F8E    DB    $77
L1F8F    DB    $77
L1F90    DB    $77


Il y a des valeurs différentes ici selon l'origine du programme (SST, EDD 4.2 et EDD 4.9).
Il y a aussi d'autres différences entre ces versions.

JM
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Mar 05 Fév 2008, 14:41    Sujet du message: Répondre en citant

Dans SST il n'y a pas d'appel (direct) à $1F91.
Je pense qu'il y a 1 appel préalable qui change la valeur du JSR pour obtenir ce que tu as sur ton source.
Cet appel depuis le boot2 doit avoir un effet (pour la suite) que je n'ai pas encore compris.

JM

Code:

<snip> see new source below



Dernière édition par . le Jeu 07 Fév 2008, 2:42; édité 1 fois
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Mar 05 Fév 2008, 14:44    Sujet du message: Répondre en citant

toinet a écrit:

Code:
L1F4B    LDA   RDROM2
         DB    $02


Shocked
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


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

MessagePosté le: Mar 05 Fév 2008, 16:26    Sujet du message: Répondre en citant

Ben ouais Wink

J'ai rechargé le soft 4.2 que m'avait passé JPL, c'est conforme au source,

toto[/img]
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Mer 06 Fév 2008, 2:17    Sujet du message: Répondre en citant

Bien que n'ayant pas fini de l'analyser, je m'interroge sur l'utilité de cette routine...

Le soft est de type single-load.
Si j'étais l'éditeur, j'aurai la crainte de voir mon soft copié à la wildcard & compagnie.
Dans ce cas il faudrait trouver une parade pour vérifier à tout moment que l'état de la machine (instant t) correspond bien à celui du démarrage.

Ca donnerait un truc du genre:

- planqué pendant la phase de boot (par exemple le boot 2), récupération des caractéristiques de la machine (emplacement du controler disk II, type de l'apple, taille de la ram) et stockage dans un coin. Note marrante: dans la technote MISC#2 pour identifier la taille de la ram, Apple utilise aussi les adresses $0800 et $0C00 et un relocator/call en page 0 tout comme EDD!!!!

- puis plus tard lorsque le soft est chargé, à plusieurs endroits souvent exécutés, on vérifie que les caractéristiques actuelles concordent bien avec celles que l'on avait au boot 2.

Si ce n'est pas le cas, c'est que la machine qui exécute EDD n'est pas celle qui l'a démarré. D'où détection d'un piratage du soft...

Mais pourquoi donc cette routine est-elle toujours appelée par le programme??? Pourquoi lors du crack les JSR au checkmem n'ont pas été remplacés par des NOP ou un RTS placé en début de checkmem?

JM
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


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

MessagePosté le: Mer 06 Fév 2008, 8:52    Sujet du message: Répondre en citant

Deckard a écrit:
Bien que n'ayant pas fini de l'analyser, je m'interroge sur l'utilité de cette routine...

...

Mais pourquoi donc cette routine est-elle toujours appelée par le programme??? Pourquoi lors du crack les JSR au checkmem n'ont pas été remplacés par des NOP ou un RTS placé en début de checkmem?

JM


Intéressante remarque, dans ma version ProDOS, j'ai shunté les appels à cette routine. Je me demande si la récupération du matériel ne peut pas servir pour des histoires de synchro horloge afin que les résultats de vitesse soient le plus juste possible ?

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



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Mer 06 Fév 2008, 13:55    Sujet du message: Répondre en citant

Pour en revenir à ma question initale...

Deckard a écrit:


Code:

SST:

1F0F-   20 4F 1F    JSR   $1F40 (BAD=> KILLED JSR)
1F12-   8D 10 1F    STA   $1F10
...
1F18-   20 91 1F    JSR   $1F80 (BAD => KILLED JSR)
1F1B-   8C 19 1F    STY   $1F19
...
1F23-   8E 37 20    STX   $2037 (KILL storage location addr!!!)


La capture de SST a été prise après l'exécution de ce code, donc ces 2 JSR sont erronés (fait exprès pour masquer ces appels).
Idem pour le STX qui sert à masquer l'endroit où est localisé l'identifiant ROM.

En fait grâce au source de EDD 4.2, on sait que le 1er JSR (JSR $1F4F) était pour récupérer le mapping disk II et le 2nd JSR (JSR $1F91) pour placer en page zéro le code ($2025-$20FF) qui capture les infos de la machine au boot.

JM
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Jeu 07 Fév 2008, 2:51    Sujet du message: Répondre en citant

JPL a écrit:
je te passe la version source ce soir
Amitiés


Hello,

bon, ce n'est plus la peine. Mais merci quand même pour la proposition Wink

Le source commenté ci-dessous (il faudrait que je me remette à l'anglais un de ces jours!!!):

Code:

         LST   OFF
         ORG   $1F00

         USE   EDD.PAGE0
         USE   EDD.ROM

********************************
*                              *
*  ESSENTIAL DATA DUPLICATOR   *
*  VERSION 4.8 STANDARD/PLUS   *
*  6502 ASSEMBLY SOURCE CODE   *
*     COPYRIGHT (C) 1987       *
*    ALL RIGHTS RESERVED       *
*     UTILICO MICROWARE        *
*   DONALD ANTHONY SCHNAPP     *
*  PRINTED OCTOBER 28, 1987    *
*                              *
********************************

* 2008/02/06 - Deckard

* Steps of the anti-Wildcard protection scheme:
*
* (1) During the boot 2 process of the original disk, call
*     a routine (H1F0F) which captures computer informations
*     (disk II cards mapping, computer model, slot 3 and ram).
*     These datas are stored in memory and are used as
*     reference.
*
* (2) A pirate uses his copy board and takes a snapshot
*     of EDD when the program is loaded and the menu
*     displayed on the screen.
*     He creates a bootable resurrect disk also called
*     a wildcard bootstrap disk (to have a 16 sectors disk
*     he can easily copy with tools such as Locksmith Fast
*     Copy, Disk Muncher, ...)
*     And he gives copies to his friends. Copies don't
*     have anymore the original boot 2 (which is lost).
*
* (3) A friend boots up one copy. And he has a different
*     apple II configuration.
*
* (4) EDD has traps: it checks (comparaison) that the
*     current computer informations are equal to the
*     stored datas (boot 2 references). If 1 difference
*     is found, EDD knows that the running program isn't
*     an original disk and a crash occurs.
*     The entry point of the check routine is H1F0C and
*     is called CHECKMEM.

*-------------------------------

ZEROPAGE_PGM EQU $0080    ; location of program in zero page
BEGPAGE2 EQU   $0800      ; beginning of text page 2
BEGSPRSE EQU   $0C00      ; byte after text page 2 (sparse)

*-------------------------------

H1F00    LDA   $72        ; code not used???
         LDY   #$34
         JSR   H2036
         LDY   $18
         JSR   GET_MACH_INFO

*-------------------------------
* Check the current computer
*-------------------------------

H1F0C
CHECKMEM JMP   DO_CHECKMEM

*-------------------------------
* Capture computer informations
* (called by EDD's boot2)
*-------------------------------

H1F0F    JSR   SEARCH_DISKII ; get disk II map
         STA   H1F0F+1    ; NOW KILL THE JSR (=hide the call) with the
                          ; retrieved value
                          ; after that: H1F0F JSR $1F40
                          ; ($1F10) = $40 <=> slot 6
         STA   DISKII_MAP ; store disk II mapping

H1F18    JSR   GET_MI_IN_ZP ; put the GET_MACH_INFO routine in zero page
         STY   H1F18+1    ; NOW KILL THE JSR (=hide the call)
                          ; after that: H1F18 JSR $1F80

         JSR   ZEROPAGE_PGM ; exec GET_MACH_INFO (store ref values)
         STX   $90
         STX   H2036+1    ; hide the BOOT_ROM_ID location
         RTS

*-------------------------------
* Exec check memory routine
*-------------------------------

DO_CHECKMEM
         JSR   SEARCH_DISKII ; get disk II mapping
         CMP   DISKII_MAP ; same as boot process?
         BNE   PIRATE     ; no => pirate!!!

                          ; Y=$80
         JSR   CMP_MI_IN_ZP ; copy check routine in zero page
         JSR   ZEROPAGE_PGM ; exec check routine et get flag result
         BCS   PIRATE     ; not the same values => pirate!!!

* Kill 1st page of bank 2
* WHY TO DO THAT HERE???? Not clear...
* Is it really the original code???

         LDA   $C083      ; read/write bank 2
         LDA   $C083
         LDY   #0

H1F3F    TYA
         STA   $D000,Y    ; $D000-$D0FF filled with increasing values
         INY
         BNE   H1F3F

         LDA   $C082      ; rom only
         RTS

         RTS

H1F4B
PIRATE   LDA   $C082      ; rom only
         NOP              ; was DFB $02 <=> CRASH (EDD 4.2 crack only)
                          ; replaced by NOP in cracked version (=no crash but
                          ; run the SEARCH_DISK II again)

*-------------------------------
* Slotscan : search for disk II
*            controller
*-------------------------------

* Out: acc = disk II map (0, 1 or more cards)
*            00000000 = no card
*            If only 1 card (otherwise ORA values)
*            00000010 = slot 1
*            00000100 = slot 2
*            00001000 = slot 3
*            00010000 = slot 4
*            00100000 = slot 5
*            01000000 = slot 6
*            10000000 = slot 7
*      Y   = $80

H1F4F
SEARCH_DISKII
         LDA   #>$C700    ; high : begin with slot 7
         STA   W1H
         LDA   #<$C700    ; low ($00)
         STA   W1L
         STA   DISKII_ROMID ; init map

* Search for a disk II interface card
* <=> check 4 bytes id

H1F5A    LDY   #7         ; Y=[7,5,3,1]
H1F5C    LDA   (W1L),Y
         CMP   DISKII_ROMID,Y ; check rom byte
         BNE   H1F7A      ; not a disk II controller

                          ; byte ok
         DEY              ; check another 1
         DEY
         BPL   H1F5C      ; continue checking...

                          ; ok disk II controller found
         LDA   W1H        ; $Cslot
         AND   #%00000111 ; get slot [1,7]
         TAY              ; in Y register
         LDA   #1         ; init mask
         BNE   H1F71      ; always

H1F70    ASL              ; shift byte according to Y reg

H1F71    DEY
         BPL   H1F70      ; >=0

         ORA   DISKII_ROMID ; if more than 1 disk II card
         STA   DISKII_ROMID ; set map

*-------------------------------

H1F7A    DEC   W1H        ; previous slot
         LDA   W1H
         CMP   #$C0       ; is it slot 0?
H1F80    BNE   H1F5A      ; no, do this slot
                          ; no disk II controller in slot 0!!!

                          ; end of scan
         LDA   DISKII_ROMID ; retrieve disk II map
         RTS

*-------------------------------
* Disk II controller rom id
*-------------------------------

H1F86
DISKII_ROMID
         HEX   40
         HEX   20         ; $Cn01 (LDX #$20)
         HEX   FF
         HEX   00         ; $Cn03 (LDY #$00)
DISKII_MAP DFB %01000000  ; =disk II in slot 6
         HEX   03         ; $Cn05 (LDX #$03)
         HEX   FF
         HEX   3C         ; $Cn07 (STX $3C)

*-------------------------------
* Machine Id
*-------------------------------

* Contains the values when an ORIGINAL
* EDD is booted.

* EDD 4.2 crack: values= $77 $77 $77
* EDD 4.9 crack: values= $EA $77 $00
* SST          : values= $06 $00 $81

BOOT_ROM_ID HEX 06        ; initial ROM_VERSION
                          ; $06 = apple IIe or //c or IIGS
                          ; $38 = apple ][
                          ; $EA = ][+ or /// (emulation)
BOOT_SC3ROM HEX 00        ; initial SLOTC3ROM
BOOT_RAM HEX   81         ; initial ram status
                          ; bit 0 [0=48k, 1=64k]
                          ; bit 7 [0=no aux, 1=aux]
                          ; $81 = aux ram & 64k (or more)

*-------------------------------
* Put GET_MACH_INFO in zero page
*-------------------------------

GET_MI_IN_ZP
         LDA   #>GET_MACH_INFO
         LDX   #<GET_MACH_INFO
         JMP   STORE_ZP   ; save it

*-------------------------------
* Put CMP_MACH_INFO in zero page
*-------------------------------

CMP_MI_IN_ZP
         LDA   #>CMP_MACH_INFO
         LDX   #<CMP_MACH_INFO

*-------------------------------
* Copy routine in $0080 (zero p)
*-------------------------------

STORE_ZP STA   W1H
         STX   W1L
         LDY   #0         ; Y[$00,$7F]
H1FA2    LDA   (W1L),Y
         STA   ZEROPAGE_PGM,Y ; $0080-$00FF
         INY
         BPL   H1FA2
                          ; out: Y=$80
         RTS


*-------------------------------
* Compare current apple II infos
* and boot 2 infos
*-------------------------------

* Out: carry = [0=original, 1=pirate!!]

                          ; ORG $0080
H1FAB
CMP_MACH_INFO
         LDX   #0         ; init flag (48k, no aux)
         LDA   BOOT_ROM_ID ; compare current & stored rom version
         CMP   ROM_VERSION ; same?
         BNE   SET_PIRATE ; no=> pirate!!!

         CMP   #$06       ; rom version $06 (IIe or //c or IIGS)?
         BNE   H1FFE      ; no: ][, ][+ or /// (emulation) -> no aux

* IIe or //c or IIGS

*
* Check card in auxiliary slot
*

         LDA   $C017      ; read SLOTC3ROM
         AND   #%10000000 ; keep bit 7
         CMP   BOOT_SC3ROM ; check original SLOTC3ROM
         BNE   SET_PIRATE ; no=> pirate!!!

         TAY
         BMI   H1FFE      ; bit 7=1 => card in slot 3 (use it, no aux)

                          ; bit 7=0 => use card in aux slot
* Aux mem or not?

                          ; main(BEGSPRSE)
         LDA   BEGSPRSE   ; same content in princ and aux mem?
         STA   AUXREAD
         STA   AUXWRT
         CMP   BEGSPRSE   ; compare with value written by GET_MACH_INFO!!!

* Aux   : main(BEGSPRSE)=aux(BEGSPRSE) IF ORIGINAL DISK
*                                      or 128k resurrect disk

         BEQ   H1FEF      ; aux memory

* >> No aux mem <<

         TAY              ; save it
         EOR   #$FF
         CMP   BEGSPRSE   ; try the eored value
         BNE   SET_PIRATE ; ha ha ha, got you

         CMP   BEGPAGE2
* No aux: BEGPAGE2 = BEGSPRSE
         BNE   SET_PIRATE ; you're dead man!!!

         STY   BEGPAGE2
         CPY   BEGSPRSE
* No aux: test mirror effect
         BNE   SET_PIRATE ; doesn't work -> killed!!

         STA   BEGPAGE2
         SEC
         BCS   H1FF8

* >> Aux mem <<

H1FEF    EOR   #$FF
         CMP   BEGPAGE2
* Aux: main(BEGSPRSE) = aux(BEGPAGE2) EOR #$FF
         BNE   SET_PIRATE

         LDX   #$80       ; prepare mask for comparaison (aux set in flag)

H1FF8    STA   MAINREAD   ; R/W main
         STA   MAINWRT

*
* Check language card
*

* Compare page filled with increasing values written by
* boot 2 process

H1FFE    LDA   $C080      ; read bank 2
         LDY   #$00
H2003    TYA
         CMP   $D000,Y
         BNE   H200C      ; no language card -> acc=0

         INY
         BNE   H2003
                          ; beq

H200C    PHP              ; save result
         LDA   $C082      ; rom
         TXA              ; retrieve bit 7 (flag)
         PLP              ; retrive result
         BNE   H2016      ; no language card

         ORA   #$01       ; 64k
H2016    CMP   BOOT_RAM   ; compare with ref
         BNE   SET_PIRATE ; no wildcard allowed with different config!!!

         CLC              ; original disk!
         RTS

SET_PIRATE SEC            ; PIRATE!!!
         STA   MAINREAD
         STA   MAINWRT
         RTS

*-------------------------------
* Get apple II informations
* (boot 2, original EDD disk)
*-------------------------------

                          ; ORG $0080

GET_MACH_INFO
         STA   MAINREAD   ; R/W main
         STA   MAINWRT
         LDA   $C082      ; rom only

         LDA   #$00       ; default=48k
         STA   BOOT_RAM

         LDA   ROM_VERSION ; get apple II model
H2036    STA   BOOT_ROM_ID
                          ; after killing STX: STA H1F80
         CMP   #$06       ; apple IIe or //c or IIGS?
         BNE   H206D      ; no: ][ or ][+ or /// (emulation). No aux.

* IIe or //c or IIGS

         LDA   $C017      ; read SLOTC3ROM
         AND   #%10000000 ; keep only bit 7
         STA   BOOT_SC3ROM ; save reference
         BMI   H206D      ; bit 7=1 : a card located in slot 3 (use it, no aux)

*
* Check the ram card in auxiliary slot.
*

* Run in the safe aera not affected by bank-switching
* the main and aux ram (=zero page).
*
* Read Apple II Technical Notes MISC#2:
*
* "Stores a value at $0800 and sees if the same value
* appears at $0C00. If so, no auxiliary memory is
* present (the non-extended 80-column card has sparse
* memory mapping which causes $0800 and $0C00 to be the
* same location".
*
* TESTS:
* =====
*
* >>>>> If no aux mem (mirror $0800/$0C00)
* <MAIN memory>
* BEGSPRSE = acc
* BEGPAGE2 = acc
* BEGPAGE2 = acc EOR #$FF (mirror=>BEGSPRSE=acc EOR #$FF)
* and BEGSPRSE = BEGPAGE2
*
* >>>>> If aux mem
* <MAIN memory>        <AUX memory>
* BEGSPRSE = acc
* BEGPAGE2 = acc
*                      BEGSPRSE = acc
*                      BEGPAGE2 = acc EOR #$FF
*                      and BEGSPRSE <> BEGPAGE2 in aux
*
* Summary:
*
* => No aux mem
*    BEGPAGE2 = BEGSPRSE
*
* => Aux mem
*    main(BEGSPRSE) =  main(BEGPAGE2)
*    aux (BEGSPRSE) <> aux (BEGPAGE2)
*    main(BEGSPRSE) =  aux (BEGSPRSE)
*    main(BEGPAGE2) =  aux (BEGPAGE2) EOR #$FF

         LDA   BEGSPRSE
         STA   BEGPAGE2
         STA   AUXREAD    ; commutation if aux memory present
         STA   AUXWRT
         STA   BEGSPRSE
         LDX   #%10000000 ; init aux flag
         EOR   #$FF       ; alter value
         STA   BEGPAGE2
         CMP   BEGSPRSE
         STA   MAINREAD   ; R/W main
         STA   MAINWRT
         BNE   H206A      ; aux mem detected

         LDX   #$00       ; no aux
H206A    STX   BOOT_RAM

*
* Test for presence of language card (48k=no, 64k=yes)
*

H206D    LDA   $C083      ; force in language card
         LDA   $C083      ; bank 2
         LDY   #0         ; fill a page with increasing values
H2075    TYA
         STA   $D000,Y    ; $D000=$00, $D001=$01, ..., $D0FF=$FF
         INY
         BNE   H2075
                          ; Y=0
                          ; and now compare that the value are always here
H207C    TYA
         CMP   $D000,Y
         BNE   H2085      ; not same value => 48k

         INY              ; continue: test the full page
         BNE   H207C
                          ; beq

H2085    PHP              ; save result
         LDA   $C082      ; rom
         PLP              ; retrieve result
         BNE   H2094      ; read and write different => no language card

         LDA   #%00000001 ; 64k
         ORA   BOOT_RAM   ; mix with aux bit
         STA   BOOT_RAM   ; store result
H2094    RTS

         DS    \,0

         SAV   OBJ/DECKARD/EDD.CHECKMEM

Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
jvernet



Inscrit le: 18 Aoû 2007
Messages: 722

MessagePosté le: Jeu 07 Fév 2008, 15:59    Sujet du message: Répondre en citant

C'est idiot, comme protection, non ? Si tu change de machine, ton soft ne marche plus ? Ou si tu rajoute une carte ?

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



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Jeu 07 Fév 2008, 16:20    Sujet du message: Répondre en citant

jvernet a écrit:
Si tu change de machine, ton soft ne marche plus ? Ou si tu rajoute une carte ?


Si tu as le logiciel original, il réactualise à chaque boot ces valeurs de référence et donc ça marche. (Tout se passe en mémoire, ces valeurs ne sont pas sauvegardées sur le disk).
Par contre tu l'as dans l'os si tu utilises une copie effectuée à la Wildcard (les références sont celles de la dernière machine qui a booté l'original).

C'est une protection qui marche... et qui est plutôt intelligente! (D'ailleurs de l'auteur de ce soft, on en attendait pas moins!!!)

JM
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
.



Inscrit le: 29 Mar 2007
Messages: 350

MessagePosté le: Ven 08 Fév 2008, 9:18    Sujet du message: Répondre en citant

Par contre il est très simple de biaiser ce controle une fois compris le truc.
Il suffit au lancement (juste avant le JMP $C00) de faire un JSR $1F0F (avec la routine intacte) pour récupérer les infos de la machine courante.

Ainsi en mémoire il y aura toujours les infos correctes et EDD croira qu'il s'agit d'un original.

JM
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> Recherches techniques (hard ou soft) 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