Voir le sujet pr�c�dent :: Voir le sujet suivant |
Auteur |
Message |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Lun 04 F�v 2008, 7:37 Sujet du message: Le routine CHECKMEM de EDD 4 |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
JPL Site Admin
Inscrit le: 12 Mar 2007 Messages: 160 Localisation: Issy les Moulineaux / PARIS
|
Post� le: Lun 04 F�v 2008, 21:00 Sujet du message: |
|
|
je te passe la version source ce soir
Amiti�s |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mar 05 F�v 2008, 12:41 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Mar 05 F�v 2008, 14:25 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Mar 05 F�v 2008, 14:27 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Mar 05 F�v 2008, 14:41 Sujet du message: |
|
|
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 Deckard le Jeu 07 F�v 2008, 2:42; �dit� 1 fois |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Mar 05 F�v 2008, 14:44 Sujet du message: |
|
|
toinet a �crit: |
Code: | L1F4B LDA RDROM2
DB $02
|
|
![Shocked](images/smiles/icon_eek.gif) |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mar 05 F�v 2008, 16:26 Sujet du message: |
|
|
Ben ouais
J'ai recharg� le soft 4.2 que m'avait pass� JPL, c'est conforme au source,
toto[/img] |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Mer 06 F�v 2008, 2:17 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
toinet
Inscrit le: 15 Juin 2007 Messages: 326 Localisation: Paris, France
|
Post� le: Mer 06 F�v 2008, 8:52 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Mer 06 F�v 2008, 13:55 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Jeu 07 F�v 2008, 2:51 Sujet du message: |
|
|
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
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 |
|
![](templates/subSilver/images/spacer.gif) |
jvernet
Inscrit le: 18 Ao� 2007 Messages: 105
|
Post� le: Jeu 07 F�v 2008, 15:59 Sujet du message: |
|
|
C'est idiot, comme protection, non ? Si tu change de machine, ton soft ne marche plus ? Ou si tu rajoute une carte ?
![Confused](images/smiles/icon_confused.gif) |
|
Revenir en haut de page |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Jeu 07 F�v 2008, 16:20 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
Deckard
Inscrit le: 29 Mar 2007 Messages: 350 Localisation: Levallois-Perret / Le Mans
|
Post� le: Ven 08 F�v 2008, 9:18 Sujet du message: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
|