; Desassemblage loader 3D-Sub * protection Loriciels type 2
; Loader initial avant decodage.
; Attention, etude partielle... Impossible de fournir un listing
; "propre" avec la protection utilisee (code auto-modifiee) sans y passer
; des heures...

7530  LD   HL,&7536  ; Adresse d'execution
7533  JP   &BD16

7536  CALL &7552  ; 
7539  CALL &7798  
753C  CALL &77AB
753F  CALL &77A4
7542  CALL &77B0
7545  CALL &BC65
7548  CALL &77DB
754B  CALL &77EA
754E  CALL &77B9
7551  JP   (HL)

7552  LD   HL,&0B0B  ; Affichage du Chat et du nom du logiciel
7555  CALL &BB75
7558  LD   DE,&81E9

755B  LD   HL,&7608  ; Message "LORICIELS Presente."
755E  CALL &75E0
7561  LD   A,&03
7563  CALL &BB90
7566  LD   HL,&75E9
7569  LD   B,&00
756B  LD   A,(HL)
756C  OR   A
756D  JR    Z,&7576
756F  INC  B
7570  INC  HL
7571  JR   &756B
7573  LD   HL,&21E9
7576  SRL  B
7578  LD   A,&14
757A  SUB  B
757B  LD   H,A
757C  LD   L,&0F
757E  CALL &BB75
7581  LD   HL,&75E9  ; Message "3D-Sub  creation Novasoft"
7584  CALL &75E0
7587  LD   A,&02
7589  CALL &BB90
758C  LD   HL,&0815
758F  CALL &BB75
7592  LD   HL,&761B
7595  CALL &75E0
7598  LD   HL,&0917
759B  CALL &BB75
759E  LD   HL,&7634  ; Message "Le programme se charge."
75A1  CALL &75E0

75A4  LD   BC,&76DE
75A7  PUSH BC
75A8  LD   DE,&00FF
75AB  LD   HL,&75E9
75AE  CALL &BBAB     ; Definition table des caracteres
75B1  POP  BC        ; un seul caractere dans la table, 255

75B2  INC  B

75B3  PUSH BC        ; BC=&77DE, adresse de saut dans SP a la fin de la
75B4  LD   B,&04     ; routine
75B6  LD   HL,&0F04
75B9  LD   DE,&764B
75BC  LD   C,&0A
75BE  PUSH HL
75BF  CALL &BB75
75C2  POP  HL

75C3  PUSH BC
75C4  PUSH HL
75C5  PUSH DE
75C6  LD   A,&FF  ; redefinition du caractere 255
75C8  EX   DE,HL
75C9  CALL &BBA8
75CC  LD   A,&FF  ; Affichage du caractere 255
75CE  CALL &BB5A
75D1  POP  HL
75D2  LD   DE,&0008
75D5  ADD  HL,DE
75D6  EX   DE,HL
75D7  POP  HL
75D8  POP  BC
75D9  DEC  C
75DA  JR   NZ,&75C3
75DC  INC  L
75DD  DJNZ &75BC
75DF  RET               ; = saut en &77DE

75E0  LD   A,(HL)  ; Affichage d'une chaine de caracteres
75E1  OR   A
75E2  RET   Z
75E3  CALL &BB5A
75E6  INC  HL
75E7  JR   &75E0

75E9  INC  SP   ; Texte "3D-SUB  creation Novasoft"
75EA  LD   B,H
75EB  DEC  L
75EC  LD   D,E
75ED  LD   D,L
75EE  LD   B,D
75EF  JR   NZ,&7611
75F1  LD   H,E
75F2  LD   (HL),D
75F3  LD   H,L
75F4  LD   H,C
75F5  LD   (HL),H
75F6  LD   L,C
75F7  LD   L,A
75F8  LD   L,(HL)
75F9  JR   NZ,&7649
75FB  LD   L,A
75FC  HALT 
75FD  LD   H,C
75FE  LD   (HL),E
75FF  LD   L,A
7600  LD   H,(HL)
7601  LD   (HL),H
7602  NOP  

7603  NOP  
7604  NOP  
7605  NOP  
7606  NOP  
7607  NOP  

7608  LD   C,H  ; Message "LORICIELS Presente"
7609  LD   C,A
760A  LD   D,D
760B  LD   C,C
760C  LD   B,E
760D  LD   C,C
760E  LD   B,L
760F  LD   C,H
7610  LD   D,E
7611  JR   NZ,&7663
7613  LD   (HL),D
7614  LD   H,L
7615  LD   (HL),E
7616  LD   H,L
7617  LD   L,(HL)
7618  LD   (HL),H
7619  LD   H,L
761A  NOP  

761B  LD   D,(HL)  ; Message "Veuillez patienter S.V.P"
761C  LD   H,L
761D  LD   (HL),L
761E  LD   L,C
761F  LD   L,H
7620  LD   L,H
7621  LD   H,L
7622  LD   A,D
7623  JR   NZ,&7695
7625  LD   H,C
7626  LD   (HL),H
7627  LD   L,C
7628  LD   H,L
7629  LD   L,(HL)
762A  LD   (HL),H
762B  LD   H,L
762C  LD   (HL),D
762D  JR   NZ,&7682
762F  LD   L,&56
7631  LD   L,&50
7633  NOP  

7634  LD   C,H   ; Message "Le programme se charge"
7635  LD   H,L
7636  JR   NZ,&76A8
7638  LD   (HL),D
7639  LD   L,A
763A  LD   H,A
763B  LD   (HL),D
763C  LD   H,C
763D  LD   L,L
763E  LD   L,L
763F  LD   H,L
7640  JR   NZ,&76B5
7642  LD   H,L
7643  JR   NZ,&76A8
7645  LD   L,B
7646  LD   H,C
7647  LD   (HL),D
7648  LD   H,A
7649  LD   H,L
764A  NOP  

764B  NOP   ; Table des caracteres redefinis
            ; Se termine a vue de nez vers &7790.

7798  LD   SP,&C002  ; Hum, je ne sais pas si ca sert...
779B  EX   (SP),HL
779C  LD   A,H
779D  ADD  A,L
779E  CP   &C7
77A0  JP   NZ,&0000
77A3  RET  

77A4  CALL &0077
77A7  LD   HL,&BCA1
77AA  RET  

77AB  EX   DE,HL
77AC  PUSH HL
77AD  EX   (SP),HL
77AE  POP  DE
77AF  RET  

77B0  LD   A,D
77B1  XOR  H
77B2  JP   NZ,&0000
77B5  CALL &77AB
77B8  RET  

77B9  CALL &77F7
77BC  LD   HL,&0039
77BF  CALL &77AB
77C2  LDIR 
77C4  CALL &784A

77C7  JR   &782F

77C9  LD   HL,(&7793)
77CC  LD   DE,(&7795)
77D0  LD   A,&7797
77D3  LD   B,A
77D4  LD   A,(HL)
77D5  LD   (DE),A
77D6  INC  HL
77D7  INC  DE
77D8  DJNZ &77D4
77DA  RET  
77DB  CALL &77AB


77DE  LD   HL,&77D3  ; Petite boucle dont l'unique but est de calculer
77E1  LD   B,&D1     ; une adresse de saut...
77E3  INC  HL        ; a la fin du calcul, HL=&7802 et BC=&0000
77E4  INC  B
77E5  PUSH HL
77E6  RET   Z        ; Saut en &7802
77E7  POP  HL
77E8  JR   &77E3

77EA  CALL &77AB
77ED  POP  HL
77EE  EX   (SP),HL
77EF  EX   DE,HL
77F0  LD   C,&23
77F2  CALL &77DB
77F5  PUSH BC
77F6  RET  
77F7  LD   BC,&7F10
77FA  OUT  (C),C
77FC  CALL &7798
77FF  CALL &77A4

7802  DI              ; Appele par routine en &77DE..
7803  LD   HL,&781C
7806  LD   (&0039),HL ; le RST &38 pointe sur une routine sans interet.
7809  LD   BC,&7F89
780C  OUT  (C),C

780E  LD   HL,&7798    ; On recommence le petit jeu du calcul de saut
7811  LD   DE,&BCA1    ; Le resultat donne &77C7 pour HL
7814  LD   SP,&C000
7817  CALL &77E1       ; Saut en &77C7 qui pointe vers &782F
781A  PUSH DE          
781B  RET  

781C  DI          ; le RST &38 detourne pointe vers cette routine.
781D  PUSH BC
781E  LD   B,&00
7820  DJNZ &7820
7822  POP  BC
7823  EI   
7824  RET  

7825  LD   SP,&C000
7828  CALL &77F7
782B  CALL &77AB
782E  JP   (HL)

; Boucle principale de la protection !
; Le programme lit les donnees en &7851 et les poke en memoire.
; Il s'agit d'un bel exemple de code automodifie !

782F  LD   IX,&7851
7833  LD   H,(IX+&00)   ; HL=&7846
7836  LD   L,(IX+&01)
7839  LD   A,(IX+&02)   ; A=&EC
783C  INC  IX
783E  INC  IX
7840  INC  IX
7842  XOR  &00
7844  LD   (HL),A  ; &EC en &7846
7845  JR   &784A   ; Suite au POKE au dessus, on va en fait en &7833

7847  CALL &77C9

784A  POP  HL   
784B  LD   A,H
784C  OR   L
784D  JP    Z,&0000
7850  RET  

; Table des octets a poker en ram (code automodifie)
; La table commence en &7851 et s'arrete a priori en &79A3.
; Elle contient en son sein une autre table, a partir de &7944

7851  DB   &78,&46,&EC
7854  DB   &75,&D9,&6E
7857  DB   &75,&DB,&DD
785A  DB   &75,&DA,&00
785D  DB   &75,&DC,&66
7860  .....
787B  DB   &78,&46,&22
787E  DB   &46,&78,&CE  ; hop, l'ordre des 2 premiers octets est inverse
7881  DB   &43,&78,&66  
....

; Table contenant les parametres des fichiers a lire (&19 octets)

7944  DEFW &1000  ; adresse de chargement  
7946  DEFW &9700  ; longueur
7948  DB &10      ; octet de synchronisation pour &BCA1
7949  DB &2B      ; octet servant a decoder le fichier charge en memoire
794A  DB &0       ; si 1, autre fichier a charger
794B  DB &0       ; si 1, fichier Basic
794C  DEFW &3000  ; adresse d'execution du programme  
----              ; le reste ne sert a rien

; Hum, la table des octets a poker en memoire recommence, mais je ne suis pas
; sur de son adresse de depart...
; Elle s'arrete en &79E3, ce qui correspond a un JR &00 en &7846 suivi d'un
; beau JP &0041, adresse de saut vers la routine decodee.

; La suite correspond probablement au loader code.

