; Desassemblage loader 3D-Sub * protection Loriciels type 2
; Loader final apres decodage.

0040  NOP

0041  LD   HL,&7944   ; Recopie en memoire ecran des parametres des
0043  LD   A,C        ; fichiers a charger.
0044  LD   DE,&FFD0
0047  LD   BC,&0019
004A  LDIR 

004C  LD   IX,&FFC9   ; Lecture des parametres d'un fichier
0050  LD   SP,&C000
0053  LD   BC,&0007
0056  ADD  IX,BC
0058  LD   H,(IX+&01) ; HL = implantation
005B  LD   L,(IX+&00)
005E  LD   D,(IX+&03) ; DE = longueur
0061  LD   E,(IX+&02)
0064  LD   A,(IX+&04) ; A = octet de synchronisation
0067  PUSH HL
0068  PUSH DE
0069  PUSH IX
006B  CALL &BCA1     ; chargement fichier sans en-tete
006E  JP   NC,&0115  ; Si erreur de chargement, routine d'arret

0071  CALL &BB48     ; Desactive la commade Break (utilisable pendant le
0074  POP  IX        ; chargement avec la touche ESC)
0076  POP  DE
0077  POP  HL

0078  LD   B,&0A     ; On decode le fichier charge en memoire
007A  LD   C,(IX+&05) ; a l'aide de l'octet dans C
007D  LD   A,(HL)
007E  XOR  C
007F  LD   (HL),A
0080  INC  HL
0081  DEC  DE
0082  DJNZ &007D
0084  XOR  (HL)
0085  LD   (HL),A
0086  INC  HL
0087  DEC  DE
0088  LD   B,A
0089  LD   A,D
008A  OR   E
008B  LD   A,B
008C  JR   NZ,&0084

008E  LD   A,(IX+&06)  ; dernier fichier a charger ? (si oui, A=1)
0091  OR   A
0092  JR   NZ,&0053

0094  LD   HL,&0041  ; On nettoie une partie du loader en RAM
0097  LD   DE,&0042
009A  LD   BC,&005A
009D  LDIR           

009F  LD   A,(IX+&07) ; Le fichier a executer est un fichier Basic ?
00A2  OR   A
00A3  JR   NZ,&00AC

00A5  LD   H,(IX+&09) ; Binaire, on se contente de recuperer l'adresse
00A8  LD   L,(IX+&08) ; d'execution et lancer le programme final.
00AB  JP   (HL)

00AC  LD   DE,&016F
00AF  LD   A,&BD38    ; On determine le type de CPC (464=&88, 664=&BB, 
00B2  CP   &88        ; 6128=&BD)
00B4  JR   NZ,&00DF

00B6  LD   A,&01      ; execution programme Basic a partir du binaire pour
00B8  LD   &AE45,A    ; un CPC 464 !
00BB  LD   HL,&016F   ; debut du programme Basic
00BE  LD   (&AE81),HL ; Calcul adresse de fin en RAM du programme.
00C1  LD   BC,(&FFD2)
00C5  ADD  HL,BC
00C6  LD   (&AE83),HL

00C9  LD   H,(IX+&09) ; on recupere l'adresse d'execution (&0000)
00CC  LD   L,(IX+&08)
00CF  LD   A,H
00D0  OR   L
00D1  JR   Z,&00D9    ; Si H=L (0 ?), on execute directement le programme
00D3  LD   (&AE7D),HL ; La, euh, je ne sais pas trop. 
00D6  LD   (&AE7F),HL

00D9  RST  &18
00DA  DEFW &00DC       ; on lance le programme avec les parametres en &DC
00DC  DB   &E3,&E9,&01 ; adresse de saut en &E9E3 rom Basic

00DF  LD   A,&01
00E1  LD   &AE2C,A  ; Execution programme Basic a partir du binaire pour un
00E4  LD   HL,&016F ; CPC 664/6128.
00E7  LD   (&AE64),HL
00EA  LD   BC,(&FFD2)
00EE  ADD  HL,BC
00EF  LD   (&AE66),HL
00F2  LD   H,(IX+&09)
00F5  LD   L,(IX+&08)
00F8  LD   A,H
00F9  OR   L
00FA  JR    Z,&0102
00FC  LD   (&AE5E),HL
00FF  LD   (&AE60),HL
0102  LD   A,&BD38     ; Test CPC 664
0105  CP   &BB
0107  JR   NZ,&010F

0109  RST  &18

010A  DEFW &010C
010C  DB   &A3,&EA,&01  ; Meme chose que pour le CPC 464
010F  RST  &18

0110  DEFW &0112
112   DB   &9E,&EA,&01

; Routine execute en cas de chargement avorte (erreur physique sur la 
; cassette, appui sur la touche ESC, etc... ).

0115  LD   HL,&0041 ; on nettoie la ram
0118  LD   DE,&0042
011B  LD   BC,&00D0
011E  LDIR 
0120  LD   HL,&0137
0123  LD   DE,&0138
0126  LD   BC,&B100
0129  LDIR 

012B  LD   BC,&BC09  ; on fait "defiler" l'ecran en positionnant une valeur
012E  OUT  (C),C     ; incoherente dans le registre 9 du CRTC (synchronisation
0130  LD   BC,&BD34  ; verticale).
0133  OUT  (C),C
0135  DI   
0136  JR   &0136
