/
SPEEDLOCK 1989 - LOADER0 T2, el gordo de verdad.asm
3375 lines (2887 loc) · 115 KB
/
SPEEDLOCK 1989 - LOADER0 T2, el gordo de verdad.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;LOADER PRINCIPAL TERMINATOR 2 ----------Speedlock D7 - 1989 ---------------
;JOSEMAN 2024
;LOADER0
;ATENCION V2 DE COMENTARIOS, SE HA CORREGIDO Y ACTUALIZADO COMENTARIOS PARA EL JUEGO HAMMERFIST
;DEPENDIENDO DEL JUEGO Y EL FORMATO DEL DISCO, SE USARAN UNAS RUTINAS U OTRAS.
;ES EL TERCER LOADER QUE SE LEE DE DISCO, pero voy a llamarle LOADER0
;LOS OTROS 2 LOADERS SON STANDARD Y NO HACEN NADA RARO, NO LOS DOCUMENTO.
;ASI QUE EN LA DOCUMENTACION LLAMARE LOADER0 A ESTE, LOADER1 Y LOADER2 A LOS OTROS
;ESTE LOADER0 HACE 50 DESENCRIPTACIONES DE EL MISMO SEGUN VA AVANZANDO, USANDO DIFERENTE TECNICAS
;REGISTRO R, SITUACION DE STACK, ETC.
;TAMBIEN HACE 13 COMPROBACIONES A LO LARGO DEL LOADER SOBRE SI ESTA CONECTADA UNA MULTIFACE 2
;SE IRA BORRANDO SEGUN AVANZA.
;AL FINAL DE ESTAS TAREAS BORRA TODA LA MEMORIA DEL CPC (INCLUIDA PANTALLA), SALVO LO QUE QUEDA DE LOADER POR EJECUTAR.
;FINALMENTE, SALTA A &A687, QUE CARGA OTRO LOADER ESTE EL REAL DE CARGA DE DATOS DEL JUEGO
;ESTE NUEVO LOADER, EL REAL, SE CARGA EN &AA00, PERO VIENEN TODAS LAS DIRECCIONES DE MEMORIA CODIFICADAS
;LA RUTINA EN &AC4A DECODIFICA TODAS ESAS DIRECCIONES PARA HACERLAS USABLES POR EL LOADER AL EJECUTAR LA LECTURA DE DATOS.
;YA QUE ESTE LOADER EN &AA00 TIENE LA CAPACIDAD DE RELOCALIZARSE EN MEMORIA.
;ESTE LOADER (&AA00) ES EL CLAVE, YA QUE ES REALMENTE EL CODIGO DE CARGA DE DATOS DEL JUEGO.
;AL SER RELOCALIZABLE LO USA EN 3 ZONAS DIFERENTES
;&AA00 --> LOADER QUE CARGARA OTRO LOADER ENCARGADO DE LEER LA PANTALLA DE PRESENTACION Y EL CODIGO PRINCIPAL DEL JUEGO.
;&0100 --> LOADER QUE CARGARA, COMO HE DICHO, PANTALLA DE PRESENTACION Y CODIGO PRINCIPAL DEL JUEGO.
;&0040 --> LOADER DE FASES, VIENE INTEGRADO EN EL CODIGO PRINCIPAL DEL JUEGO Y LO MOVERA A &0040 AL EJECUTAR JUEGO.
;ESTOS 3 LOADERS SON EXACTAMENTE EL MISMO, SOLO QUE RELOCALIZABLE.
;NOTA, aqui usare las direcciones ya relocalizadas, que no coinciden si por ejemplo echas un vistazo al loader ANTES de reloc.
;NOTA2, en los comentarios, el valor que toman los registros, estan comentados con el PRIMER VALOR que toman.
;-----------NOTAS IMPORTANTES PARA ENTENDER EL SPEEDLOCK A GROSSO MODO-------------------------------
;loader en &AA00 --> punto de entrada a rutina en &AA1A seria el loader real de carga de datos
;loader en &0100 --> punto de entrada a rutina en &3000 (hace ldir a &3000), mismo loader real de carga de datos.
;loader en &0040 --> punto de entrada a rutina en &0040 mismo loader que los anteriores.
;Este loader se usara para cargar ficheros de apoyo, ficheros del juego y fases del juego.
;loader0 carga ficheros de apoyo y a loader1 (rutina &AA1A)
;loader1 carga datos principales del juego (rutina &3000)
;loader2 carga fases del juego (rutina &0040)
;los ficheros de apoyo son un fichero de texto con nombres de fase y un fichero de datos para calcular tamdatos/track/sector
;NOTA, es muy importante tener en cuenta que estos loaders no usan nombres de ficheros realmente, solo track/sector.
;los textos se usan para posicionar punteros en track/sector y tamano datos.
;estos 3 loaders actuan de forma exactamente igual
;primero cargan un fichero de texto, comparan el texto que quieren cargar con ese fichero de texto,
;esa comparacion posiciona un puntero de 16bits
;posteriormente carga otro fichero de datos
;usaran ese puntero para calcular tamano de datos a cargar, track y sector desde donde iniciar lectura de datos en disco.
;-----------COMO PROCEDER PARA COPIAR LOS DATOS DEL JUEGO PARA UN POSIBLE CRACK ------------------------------
;con Terminator 2 y Darkman (en mi Github) los pasos son exactamente los mismos (solo que cambian las direcciones)
;en el terminator 2
;para pantalla de carga y ficheros principales juego
;breakpoint en &3000
;reg hl=&018C --> direccion donde esta texto "TITLE" (PANTALLA DE CARGA)
;reg de=&BFF0 --> zona de RAM donde metera los datos (16bytes datos colores y pantalla)
;breakpoint en &30B6
;reg de=&4010, tamano a copiar de datos (en este caso 16 bytes datos colores + &4000 de pantalla de carga)
;breakpoint en &306A
;En winape -> select block -> &BFF0 - &FFFF -> save... -> elige nombre fichero.
;repite pasos para "LOWCODE" y MAINCODE
;para fases
;breakpoint en &0040
;reg hl=&24ED --> direccion donde esta texto "FRONTSC" (PANTALLA PRINCIPAL MENU EN ESTE CASO, DESPUES SERAN FASES)
;reg de=&3FF0 --> zona de RAM donde metera los datos (16bytes datos colores y pantalla)
;breakpoint en &00F6
;reg de=&4010, tamano a copiar de datos (en este caso 16 bytes datos colores + &4000 de pantalla de carga)
;breakpoint en &00AA
;En winape -> select block -> &3FF0 - &7FFF -> save... -> elige nombre fichero.
;repite pasos para toodas las fases segun se cargan (no son pocas y algunas fases cargan mas de un fichero)
;Despues de todo esto, toca hacer la magia de los loaders fabricacion casera para que se comporten como los loaders originales
;es tedioso, muy tedioso, no lo voy a negar
;--------------------------------------------------------------------------------------------------------------
;------------------DOCUMENTACION DE LOADER ORIGINAL-------------------------------------------------------------------
;LOADER0 se inicia aqui, donde hara una locurota de 50 desencriptaciones y 13 comprobaciones del Multiface conectado.
;pero como he dicho, el meollo empieza en rutina &AC41
;situacion loader &9EBF-&A849
org #9ebf
ld r,a ;a=&69, este resultado lo consiguio en funcion manda_CMDyPARAMETROS_FDC de loaders anteriores no documentados.
;&00 sub &97=&69 ;Z=0 C=1
;registro r, se usa para refrescar la memoria RAM (si no se pierde la informacion contenida en RAM),
;r se incrementa en cada instruccion ejecutada, el Z80 lo coloca en el bus de direcciones para provocar
;accesos "vacios" a la memoria, con lo que la mantenia en funcionamiento.
;NOTA, En amstrad CPC el refresco de memoria lo efectua el Gate Array NO el registro r del Z80.
;El registro R es conocido por usarse en por ejemplo, protecciones anticopia, ya que al incrementarse en cada
;instruccion ejecutada, es facil hacer comprobaciones de si se han ejecutado el numero de instrucciones esperadas
;en el loader, es decir, no se ha modificado el loader por digamos un cracker.
;--------------DESENCRIPTACION 1 DEL LOADER --------------------------------------------------
ld de,&097c ;para hacer bucle
ld hl,l9ece ;direccion donde empezara a incrementar un byte el numero de instruccion Z80 contenida en ella
;es decir lo contenido en esas direcciones no son las instrucciones reales antes de ejecutar el bucle
inc (hl)
dec de
ld a,d
inc hl
or e ;comprueba si reg DE ha llegado a 0 (aunque le cuela el inc hl por el medio para disimular la comparacion)
;aqui abajo cambia las instrucciones del codigo desde &9ECE-&A849; comprobado.
;pongo ya el codigo cambiado con el bucle anterior
;---inicio codigo cambiado con bucle inc (hl)
.l9ece equ $ + 2
jp nz,#9ec7 ;para hacer el bucle de cambio de codigo.
;por aqui ya ha cambiado todo el codigo desde &9ECE-&A849
jp l9ed2 ;efectua salto a una rutina ya cambiada con codigo real.
;aunque la rutina esta justo debajo de este jp, sigue justo por aqui debajo.
.l9ed2
ld bc,#7f89 ;Gate Array
out (c),c ;Mode 1, lower enable & upper disabled
;activa la lower rom, porque si hay un Multiface 2 conectado al equipo,
;al activar el multiface (lo hace justo aqui abajo), esa rom esta visible (como lectura)
;a partir de &0000 en el cpc.
;---------------COMPROBACION 1 PRESENCIA MULTIFACE 2-------------------------------
;proteccion frente a un Multiface 2 conectado al equipo
ld bc,#fee8 ;Multiface 2 ROM/RAM
out (c),c ;Activa Multiface 2 (visible en la lower ROM en el amstrad)
ld a,(#0000) ;lee de la LOWER ROM, si hay un multiface 2 conectado al CPC
;en la posicion &0000 de la lower rom se leera el byte &F3
cp #f3 ;hay un &F3 en &0000 LOWER ROM?
jp z,#0000 ;si lo hay entonces es que se ha activado un multiface2 conectado al equipo.
;salta a la direccion &0000 que en este caso es la ROM del multiface 2, pero el equipo se queda en un
;bucle completo infinito sin hacer nada.
;entiendo que si se intenta usar el multiface 2, la copia que genere en este punto no sera usable
;por la zona en la que se encuentra el program counter (NO ESTOY SEGURO, aclaracion necesitada)
;por aqui no hay Multiface 2 conectado al equipo.
ld hl,l9ee9 ;(hl)=&00
.l9ee9 equ $ + 2
.l9ee8 equ $ + 1
ld bc,#0032 ;50bytes que movera de &9ee9
ld de,l9ee8 ;destino lddr
lddr ;pone a &00 (l9ee9)=&00 las direcciones &9EE8-&9EB7
;borra el principio de este loader e incluso mas hacia atras
;--------------DESENCRIPTACION 2 DEL LOADER --------------------------------------------------
ld hl,l9f04
ld bc,#0946 ;para bucle que va a hacer aqui abajo
ld d,#2c ;valor para efectuar operaciones con registro r
ld a,r ;LEE DEL REGISTRO r, cargado con &69 al principio de este loader.
;registro r se fue incrementando con cada instruccion ejecutada.
;al cargarlo con un valor predefinido al principio, y siendo conocedor de lo que hace este loader
;se puede saber el valor que deberia tener el registro r si nadie ha tocado nada.
;basado en ese valor va a decodificar el loader (&9F04-&A849)
;si "alguien" ha tocado el codigo del loader, digamos un cracker por poner un ejemplo.
;la decodificacion fallara y el loader dejara de funcionar.
xor d ;&49 xor &2c de primeras
;%01001001 xor %00101100
add (hl) ;le suma a registro A lo que hay en (hl)
sub #07 ;resta &07 al resultado del add anterior
ld (hl),a ;guarda ese resultado en (hl), es decir vuelve a cambiar el codigo de este loader
;pero esta vez dependiendo del valor del registro r
;cualquier modificacion en el inicio de este loader alterara el valor del registro r
;con lo cual lo que haria aqui es estropear el codigo que aqui esta poniendo con los
;ld (hl),a en bucle.
inc hl ;siguiente instruccion a "poner bien"
dec bc ;decrementa bucle de "decodificacion".
ld a,b
or c ;comprueba que bc ha llegado a &00 (fin de bucle)
;el codigo a partir de aqui abajo es cambiado con este bucle (incluido el jp nz del propio bucle)
;aqui abajo pongo ya el codigo cambiado
.l9f04 equ $ + 2
jp nz,#9ef7 ;si bc no ha llegado a 0 sigue bucleando, sigue "decodificando" instrucciones/codigo.
;decodifica codigo &9F04-&A849 (incluido el propio jp nz de este bucle)
;si algo falla, este propio jp fallara y el loader fallara.
jp l9f08 ;salta justo aqui abajo
;--------------DESENCRIPTACION 3 DEL LOADER --------------------------------------------------
.l9f08 ;vuelve a decodificar usando registro r como llave
;decodifica codigo &9F20-&A849 (incluido el propio jp que hace el bucle)
ld hl,&9f20 ;inicio a descodificar
ld bc,#092a ;tamano a descodificar.
ld d,#5f ;parametro definido con respecto al valor que deberia tener el registro r sin variacion de loader.
ld a,r
xor (hl)
xor d
ld (hl),a
ld d,a
inc hl ;siguiente direccion a decodificar.
dec bc ;decrementa bucle de decodificacion
inc d
ld a,c
or b
jp z,l9f23 ;cuando llegue a cero el bucle salta, el codigo de esa zona ya habra sido modificado.
;por aqui abajo se ha vuelto a modificar todo el codigo de loader.
;pongo el codigo ya modificado.
jp #9f10 ;salto para hacer bucle
.l9f22 equ $ + 1
jp (ix) ;de inicio no ejecuta esta instruccion, al salir del bucle salta a &9F23, la sobreescribira de todas maneras.
.l9f23
ld hl,l9f23 ;inicio de este punto del programa
ld bc,#0064 ;tamano para el lddr, 100 bytes
ld de,l9f22 ;destino (justo detras)
lddr ;escribe el valor &21 desde &9F22-&9EBF, sigue borrando rastro del loader segun avanza.
;--------------DESENCRIPTACION 4 DEL LOADER --------------------------------------------------
;vuelve a decodificar el codigo del loader, una vez mas. &9F23-&A849
ld hl,l9f3e
ld bc,#090c
ld a,r
add (hl)
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo el codigo ya decodificado por rutina anterior
.l9f3e equ $ + 2
jp nz,#9f34 ;mientras no llegue a 0 reg bc sigue decodificando
jp l9f42 ;salta justo aqui abajo
;---------------COMPROBACION 2 PRESENCIA MULTIFACE 2-------------------------------
.l9f42 ;vuelve a mirar si hay una multiface 2 conectada al equipo.
ld bc,#7f89 ;Gate Array
out (c),c ;Mode 1, lower enable & upper disabled
;activa la lower rom, porque si hay un Multiface 2 conectado al equipo,
;al activar el multiface (lo hace justo aqui abajo), esa rom esta visible (como lectura)
;a partir de &0000 en el cpc.
ld bc,#fee8 ;Multiface 2 ROM/RAM
out (c),c ;Activa Multiface 2 (visible en la lower ROM en el amstrad)
ld a,(#0000);lee de la LOWER ROM, si hay un multiface 2 conectado al CPC
;en la posicion &0000 de la lower rom se leera el byte &F3
cp #f3 ;hay un &F3 en &0000 LOWER ROM?
jp z,#0000 ;si lo hay entonces es que se ha activado un multiface2 conectado al equipo.
;salta a la direccion &0000 que en este caso es la ROM del multiface 2, pero el equipo se queda en un
;bucle completo infinito sin hacer nada.
;entiendo que si se intenta usar el multiface 2, la copia que genere en este punto no sera usable
;por la zona en la que se encuentra el program counter (NO ESTOY SEGURO, aclaracion necesitada)
;por aqui no hay Multiface 2 conectado al equipo.
;vuelve a borrar/machacar el loader hacia atras &9f59-&9f27
ld hl,l9f59 ;inicio de borrado
.l9f59 equ $ + 2
.l9f58 equ $ + 1
ld bc,#0032 ;tamano de borrado
ld de,l9f58 ;destino (va decrementando)
lddr ;borra
;--------------DESENCRIPTACION 5 DEL LOADER --------------------------------------------------
;vuelve a decodificar loader &9F74-&A849
ld hl,l9f74
ld bc,#08d6
ld d,#3f
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
inc hl
dec bc
ld a,b
or c
.l9f74 equ $ + 2
;pongo el codigo ya decodificado.
jp nz,&9F78
jp l9f78 ;salta justo aqui abajo
;---------------COMPROBACION 3 PRESENCIA MULTIFACE 2-------------------------------
;y otra vez que detecta si hay una multiface 2 conectada al equipo.
;ya no comento el codigo de la deteccion.
.l9f78
ld bc,#7f89
.l9f7b
out (c),c
ld bc,#fee8
out (c),c
ld a,(#0000)
cp #f3
jp z,#0000
;por aqui no hay multiface 2 conectada
;vuelve a borrar rastro del loader &9f8f-&9F5D
ld hl,l9f8f
.l9f8f equ $ + 2
.l9f8e equ $ + 1
ld bc,#0032
ld de,l9f8e
lddr ;borra
;--------------DESENCRIPTACION 6 DEL LOADER --------------------------------------------------
;vuelve a decodificar codigo del loader
;decodifica &9FAA-&A849
ld hl,l9faa
ld bc,#08a0
ld d,#6d
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
inc hl
dec bc
ld a,b
or c
.l9faa equ $ + 2
;pongo el codigo decodificado
jp nz,#9f9d
jp l9fae ;salta justo aqui abajo
;vuelve a borrar su rastro hacia atras &9fb1-&9f4D
.l9fae
ld hl,l9fb1
.l9fb1
ld bc,#0064
ld de,&9fb0
lddr ;borra
;--------------DESENCRIPTACION 7 DEL LOADER --------------------------------------------------
;vuelve a descodificar el codigo del loader #cansino
;decodifica &9fcc-&a849
ld hl,l9fcc
ld bc,#087e
ld d,#63
ld a,r
add (hl)
sub d
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo ya decodificado
.l9fcc equ $ + 2
jp nz,#9fc1
jp l9fd0 ;salta justo aqui abajo.
.l9fd0 ;vuelve a borrar sus pasos
;&9FD0-&9F6C
ld hl,l9fd0
ld de,&9fcf
ld bc,#0064
lddr ;borra
;--------------DESENCRIPTACION 8 DEL LOADER --------------------------------------------------
;decodifica loader desde &A000-
ld bc,#084a
ld hl,&A000 ;posicion de datos loader (los cuales han sido decodificados tropecientas veces a estas alturas)
call l9fe4 ;hace call justo aqui abajo para meter en pila &9FE4
.l9fe4
pop ix ;recupera ese valor de pila ix=&9FE4
ld de,#001c ;desplazamiento ix
add ix,de ;suma desplazamiento, ix=&A000 (lo usa como datos para decodificar, si se ha movido un byte el loader falla)
.l9feb
ld a,r
xor hx
sub (hl)
xor lx
ld (hl),a
dec bc
ld a,c
inc hl
or b
jp nz,l9ffd ;mini salto para marear la perdiz
jp la000 ;salto una vez decodificado loader
.l9ffd
jp l9feb ;hace bucle de decodificacion
;pongo datos ya decodificados
.la000
ld sp,la00f ;cambia de sitio el Stack Pointer (zona con datos del propio loader)
;vuelve a borrar sus pasos OTRA vez &A00c-&9fec (valor &ED de borrado)
ld hl,la00c
ld de,la00b
.la00b equ $ + 2
ld bc,#0020
.la00c
lddr ;borra
.la00f equ $ + 1
.la00e
jp pe,la024 ;Salta si el indicador de paridad/desbordamiento (P/O) esta a uno (pero salta a codigo sin decodificar)
;esta zona se DECODIFICA aqui abajo (incluido salto), &a00e
;--------------DESENCRIPTACION 9 DEL LOADER --------------------------------------------------
;VUELVE A DECODIFICAR EL CODIGO (ASI EN MAYUSCULAS)
ld hl,la023
.la014
ld de,la00e
ld bc,#0827
ld a,r
xor (hl)
ld (hl),a
ldi ;va metiendo en &a00e ultimo byte decodificado, tambien los va metiendo en la posicion correcta de memoria.
dec de ;decrementa de, el ldi lo incremento. Para mantener direccion &A00E en reg de.
ret po ;aqui hay una cosa importante, el stack se cambio a codigo del loader
;en ese codigo, el stack esta posicionado con valor &A024, que justamente es a donde tiene que saltar el loader
;cuando acabe de decodificar.
;PO se activara cuando registro BC=&0000, loader decodificado.
;pongo codigo ya decodificado.
.la023 equ $ + 1
jr &A01A ;bucle decodificacion.
.la024 ;salta aqui cuando el RET PO se cumple.
;borra los pasos del loader hasta este punto
ld hl,la024
ld bc,#0064
ld de,#a023
lddr ;borra &A023-&9FC0 (incluso borra partes ya borradas anteriormente, fiesta del borrado)
;--------------DESENCRIPTACION 10 DEL LOADER --------------------------------------------------
;VUELVE a decodificar loader. &A03F-&A849
ld hl,la03f
ld bc,#080b
ld a,r
xor (hl)
ld (hl),a
inc hl
dec bc
ld a,b
or c
.la03f equ $ + 2
;pongo codigo ya decodificado
jp nz,#a035 ;bucle decodificacion
jp la043 ;salta justo aqui abajo
.la043 ;vuelve a borrar sus pasos... matame camion
ld hl,la043
ld bc,#0064
ld de,&a042
lddr ;borra &A042-&9FDF (con &21)
;--------------DESENCRIPTACION 11 DEL LOADER --------------------------------------------------
;vuelve a decodificar su propio codigo, &A05E-&A849
ld hl,la05e
ld bc,#07ec
ld a,r
xor (hl)
ld (hl),a
inc hl
dec bc
ld a,b
or c
.la05e equ $ + 2
;pongo el codigo ya decodificado
jp nz,#a054
jp la062 ;salta justo aqui debajo
;---------------COMPROBACION 4 PRESENCIA MULTIFACE 2-------------------------------
.la062 ;vuelve a efectuar deteccion de posible multiface 2
ld bc,#7f89
out (c),c
ld bc,#fee8
out (c),c
ld a,(#0000)
cp #f3
jp z,#0000
;vuelve a borrar sus pasos hasta aqui
ld hl,la079
.la079 equ $ + 2
.la078 equ $ + 1
ld bc,#0032
ld de,la078
lddr ;borra desde &A078-&A047 (con valor &00)
;--------------DESENCRIPTACION 12 DEL LOADER --------------------------------------------------
;vuelve a decodificar su propio codigo (sorpresa)
;decodifica &A094-&A849
ld hl,la094
ld bc,#07b6
ld d,#5e
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
inc hl
dec bc
ld a,b
or c
.la094 equ $ + 2
;pongo codigo ya decodificado
jp nz,#a087 ;bucle decodificacion
jp la098 ;salta justo aqui abajo
.la098 ;vuelve a borrar sus pasos
ld hl,la098
ld bc,#0064
ld de,&a097
lddr ;borra &A097-&A034 (con &21)
;--------------DESENCRIPTACION 13 DEL LOADER --------------------------------------------------
;vuelve a decodificarse (me aburro)
ld hl,la0b3
ld bc,#0797
ld a,r
xor (hl)
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo ya decodificado
.la0b3 equ $ + 2
jp nz,#a0a9 ;bucle decodificacion
jp la0b7 ;salta justo aqui debajo.
;---------------COMPROBACION 5 PRESENCIA MULTIFACE 2-------------------------------
;vuelve a detectar multiface 2
.la0b7
ld bc,#7f89
out (c),c
ld bc,#fee8
out (c),c
ld a,(#0000)
cp #f3
jp z,#0000
;borra sus pasos
ld hl,la0ce
.la0ce equ $ + 2
.la0cd equ $ + 1
ld bc,#0032
ld de,la0cd
lddr ;borra &a0cd-&a09d (&00)
;--------------DESENCRIPTACION 14 DEL LOADER --------------------------------------------------
;si, vuelve a decodificar.
ld hl,la0e9
ld bc,#0761
ld d,#2b
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
inc hl
dec bc
ld a,b
or c
;codigo ya decodificado
.la0e9 equ $ + 2
jp nz,#a0dc ;bucle deco
jp la0ed ;salta aqui abajo
;si, lo estas adivinando, vuelve a borrar su rastro.
.la0ed
ld hl,la0ed
ld bc,#0064
ld de,&a0ec
lddr ;borra &a0ec-&a089
;--------------DESENCRIPTACION 15 DEL LOADER --------------------------------------------------
;apuesto a que va a decodificar, si, estaba en lo cierto...
ld hl,la108
ld bc,#0742
ld a,r
xor (hl)
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo decodificado
.la108 equ $ + 2
jp nz,#a0fe ;bucle deco
jp la10c ;salta justo aqui debajo
;vuelve a borrar sus pasos
.la10c
ld hl,la10c
ld bc,#0064
ld de,&a10b
lddr ;borra &A10B-&A0A8
;--------------DESENCRIPTACION 16 DEL LOADER --------------------------------------------------
;vuelve a decodificar &A127-&A849
ld hl,la127
ld bc,#0723
ld a,r
xor (hl)
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo decodificado
.la127 equ $ + 2
jp nz,#a11d ;bucle deco
jp la12b ;salta justo aqui abajo
;---------------COMPROBACION 6 PRESENCIA MULTIFACE 2-------------------------------
;VUELVE a detectar multiface 2
.la12b
ld bc,#7f89
out (c),c
ld bc,#fee8
out (c),c
ld a,(#0000)
cp #f3
jp z,#0000
;y otra vez a borrar sus pasos.
ld hl,la142
.la142 equ $ + 2
.la141 equ $ + 1
ld bc,#0032
ld de,la141
lddr ;borra &A141-&A110 (&00), no borra todo, deja &a10d-&a10f
;--------------DESENCRIPTACION 17 DEL LOADER --------------------------------------------------
;vuelve a decodificar &A15D-&A849
.la148
ld hl,la15d
ld bc,#06ed
ld d,#2a
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
.la157
inc hl
dec bc
ld a,b
or c
;pongo codigo deco
.la15d equ $ + 2
jp nz,#a150 ;bucle deco
jp la161 ;salta aqui debajo
;--------------DESENCRIPTACION 18 DEL LOADER --------------------------------------------------
;VUELVE A DECODIFICAR &A179-&A849
.la161
ld hl,la179
ld bc,#06d1
ld d,#6d
ld a,r
xor (hl)
xor d
ld (hl),a
ld d,a
inc hl
dec bc
inc d
ld a,c
or b
jp z,la17c ;acabada decodificacion
;codigo ya decodificado
.la179 equ $ + 2
jp #a169 ;bucle deco
jp (ix) ;esta instruccion no se ejecuta nunca.
;salta aqui despues de la deco
.la17c
ld sp,&a18b ;cambia el stack de sitio (zona con datos loader)
;borra sus pasos
ld hl,&a188
ld de,&a187
ld bc,#0020
lddr ;borra &A187-&A168, deja sin borrar &A143-&A167, aunque lo borrara en su siguiente borrado de rastro.
.la18a
jp pe,la1a0 ;no se efectua este salto
;--------------DESENCRIPTACION 19 DEL LOADER --------------------------------------------------
;vuelve a decodificar.
ld hl,la19f
ld de,la18a
ld bc,#06ab
ld a,r
xor (hl)
ld (hl),a
ldi
dec de
ret po ;cuando bc llegue a &0000 se cumple este ret, "retorna" a &A1A0, ya que cuando cambio el stack
;tiene esa direccion ya cargada en el.
;pongo codigo ya decodificado
.la19f equ $ + 1
jr #a196 ;bucle deco
;salta aqui por direccion guardada en stack pointer al cambiarlo de sitio.
;borra sus pasos.
.la1a0
ld hl,la1a0
ld bc,#0064
ld de,la19f
lddr ;borra &A19F-&A13C
;--------------DESENCRIPTACION 20 DEL LOADER --------------------------------------------------
;vuelve a decodificarse &A1BB-&A849
ld hl,la1bb
ld bc,#068f
ld a,r
xor (hl)
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo decodificado
.la1bb equ $ + 2
jp nz,#a1b1 ;bucle deco
jp la1bf ;salta justo aqui debajo
;---------------COMPROBACION 7 PRESENCIA MULTIFACE 2-------------------------------
;vuelve a detectar multiface 2
.la1bf
ld bc,#7f89
out (c),c
ld bc,#fee8
out (c),c
ld a,(#0000)
cp #f3
jp z,#0000
;borra su rastro.
ld hl,&a1d6
ld bc,#0032
ld de,&a1d5
lddr ;borra &A1D5-&A1A4
;--------------DESENCRIPTACION 21 DEL LOADER --------------------------------------------------
;vuelve a decodificarse
ld hl,la1f1
ld bc,#0659
ld d,#3f
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo ya decodificado
.la1f1 equ $ + 2
jp nz,#a1e4 ;bucle decodificacion
jp la1f5 ;salta justo aqui abajo
;---------------COMPROBACION 8 PRESENCIA MULTIFACE 2-------------------------------
;vuelve a detectar multiface2
.la1f5
ld bc,#7f89
out (c),c
ld bc,#fee8
out (c),c
ld a,(#0000)
cp #f3
jp z,#0000
;borra sus pasos
ld hl,la20c
.la20c equ $ + 2
.la20b equ $ + 1
ld bc,#0032
ld de,la20b
lddr ;borra &A20B-&A1DA (&00)
;--------------DESENCRIPTACION 22 DEL LOADER --------------------------------------------------
;vuelve a decodificar loader.
ld hl,la227
ld bc,#0623
ld d,#6d
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo decodificado
.la227 equ $ + 2
jp nz,#a21a
jp la22b ;salta justo aqui abajo
;borr sus pasos
.la22b
ld hl,la22b
ld de,&a22a
ld bc,#0064
lddr ;borra &A22A-A1C7 (&21)
ld bc,#05ef
ld hl,la25b
call la23f ;llama justo aqui debajo con call para meter direccion siguiente a la actual del loader en el Stack Pointer
;--------------DESENCRIPTACION 23 DEL LOADER --------------------------------------------------
;decodifica loader
.la23f
pop ix ;recupera direccion actual en memoria del loader
ld de,#001c
add ix,de ;usara esta suma + direccion del loader en RAM para decodificar codigo.
.la246
ld a,r
xor hx
sub (hl)
xor lx
ld (hl),a
dec bc
ld a,c
inc hl
or b
jp nz,la258
jp la25b ;acabada decodificacion
.la258
jp la246 ;bucle decodificacion
;pongo codigo ya decodificado
;---------------COMPROBACION 9 PRESENCIA MULTIFACE 2-------------------------------
;vuelve a detectar Multiface 2 conectada
.la25b
ld bc,#7f89
out (c),c
ld bc,#fee8
out (c),c
ld a,(#0000)
cp #f3
jp z,#0000
;vuelve a borrar sus pasos.
ld hl,&a272
ld bc,#0032
ld de,&a271
lddr ;borra &A271-&A240
;--------------DESENCRIPTACION 24 DEL LOADER --------------------------------------------------
;vuelve a decodificar loader
ld hl,la28d
ld bc,#05bd
ld d,#2f
ld a,r
xor d
add (hl)
sub #07
ld (hl),a
inc hl
dec bc
ld a,b
or c
;pongo codigo decodificado
.la28d equ $ + 2
jp nz,#a280 ;bucle decodificacion
jp la291 ;salta justo aqui debajo
;--------------DESENCRIPTACION 25 DEL LOADER --------------------------------------------------
.la291
ld de,#05ac
ld hl,la29e
dec (hl)
dec de
ld a,d
inc hl
or e
;pongo codigo decodificado
.la29e equ $ + 2
jp nz,#a297 ;bucle decodificacion
jp la2a2 ;salta aqui debajo
.la2a2
ld sp,la2b1 ;cambia de sitio stack pointer
;borra sus pasos
ld hl,la2ae
ld de,&a2ad
ld bc,#0020
.la2ae
lddr ;borra &A2AD-&A28E
.la2b1 equ $ + 1
.la2b0
jp pe,&a2c6 ;no se cumple
;--------------DESENCRIPTACION 26 DEL LOADER --------------------------------------------------
;vuelve a decodificar
ld hl,la2c5
ld de,la2b0
ld bc,#0585
ld a,r
xor (hl)
ld (hl),a
ldi
dec de
ret po ;se cumple ret cuando bc=&0000, la pila ya tiene la direccion correcta por el cambio de stack pointer anterior
;(sp)=&A2C6
.la2c5 equ $ + 1
jr #a2bc ;bucle decodificacion
;borra sus pasos
.la2c8 equ $ + 2
ld de,la2c8
.la2c9
ld hl,la2c9
ld bc,#0064
lddr ;borra &A2C8-&A265
;--------------DESENCRIPTACION 27 DEL LOADER --------------------------------------------------
;vuelve a decodificar.
ld bc,#0566
ld sp,&a848 ;cambia sp, (sp)=&535D, &A848 es el final del loader, es decir usa esos datos decodificados cienes de veces
;para decodificarse otra vez, Y PARA DECODIFICAR LOADER AL REVES
;desde &A849-&A2E4
.la2d7
pop de ;de=&535D
ld a,r
xor d
ld d,a
push de
dec bc
ld a,c
dec sp
or b
jp nz,la2d7 ;bucle decodificacion
;pongo codigo decodificado
jp la2e7 ;salta justo aqui debajo.
;vuelve a borrar sus pasos.
.la2e7
ld hl,la2eb
.la2eb equ $ + 1
.la2ea
ld bc,#0032
ld de,la2ea
lddr ;borra &A2EA-&A2B9 (&32)
;--------------DESENCRIPTACION 28 DEL LOADER --------------------------------------------------
;vuelve a decodificarse
ld hl,la306
ld bc,#0544
ld d,#5f
ld a,r
xor d
add (hl)
cpl
ld (hl),a
inc hl
dec bc
ld a,b