Antonio Giner, autor del remake para PC, me pasó hace unos días la siguiente información.
Como no ha conseguido registrarse en ZdP, me ha pedido que la publique yo.
Te paso la rutina que saca los samples por el PC speaker. Verás que lo primero que hace es esta comprobación:
153C:63B6 803E5E6501 CMP BYTE PTR [655E],01
Ahí comprueba si se ha cargado la pista protegida con el anticopia. Si la ha cargado, salta al Avemaría, si no, te deriva al "Pirata, pirata...".
Aquí empieza la rutina de "Pirata,..."
153C:63D0 B90A00 MOV CX,000A
Como ves, es un bucle que se repite 10 veces.
En [E3B0] está almacenado el sample "Pirata", en [E3AC] el Avemaría. Son punteros que se conocen en runtime.
En esta dirección:
153C:63F2 8306AAE307 ADD WORD PTR [E3AA],+07
Lo que hace es aumentar el valor del retardo, que a la postre reduce la frecuencia, de forma que con cada iteración del bucle, "Pirata" suena más grave hasta llegar a ultratumba.
Al terminar la rutina maldita ejecuta un salto mortal:
153C:63F9 EA0000FFFF JMP FFFF:0000
Otras comprobaciones que hace:
153C:6406 8CC8 MOV AX,CS
153C:6408 3D0010 CMP AX,1000
153C:640B 7405 JZ 6412
Esto comprueba que el juego se ha cargado en el segmento 1000, cosa que no ocurriría si se extrajese la imagen del disco y el sistema operativa la cargase en un segmento arbitrario.
La interrupción del timer se captura para poder sacar los samples por el PC speaker. La cambia temporalmente por la 6430. Esto lo hace en la rutina 6461. La verdad a mí me sigue alucinando esta técnica para sacar samples por el PC speaker.
Código: Seleccionar todo
153C:63A6 1E PUSH DS
153C:63A7 B80000 MOV AX,0000
153C:63AA 8ED8 MOV DS,AX
153C:63AC A11304 MOV AX,[0413]
153C:63AF 3D0002 CMP AX,0200
153C:63B2 1F POP DS
153C:63B3 7309 JNB 63BE
153C:63B5 2E CS:
153C:63B6 803E5E6501 CMP BYTE PTR [655E],01
153C:63BB 7513 JNZ 63D0
153C:63BD C3 RET
153C:63BE 1E PUSH DS
153C:63BF 06 PUSH ES
153C:63C0 57 PUSH DI
153C:63C1 56 PUSH SI
153C:63C2 53 PUSH BX
153C:63C3 51 PUSH CX
153C:63C4 52 PUSH DX
153C:63C5 E83600 CALL 63FE
153C:63C8 5A POP DX
153C:63C9 59 POP CX
153C:63CA 5B POP BX
153C:63CB 5E POP SI
153C:63CC 5F POP DI
153C:63CD 07 POP ES
153C:63CE 1F POP DS
153C:63CF C3 RET
153C:63D0 B90A00 MOV CX,000A
153C:63D3 51 PUSH CX
153C:63D4 B000 MOV AL,00
153C:63D6 A2B4E3 MOV [E3B4],AL
153C:63D9 E88500 CALL 6461
153C:63DC C436B0E3 LES SI,[E3B0]
153C:63E0 BF0000 MOV DI,0000
153C:63E3 BBB9E3 MOV BX,E3B9
153C:63E6 B94401 MOV CX,0144
153C:63E9 FB STI
153C:63EA 803EB4E300 CMP BYTE PTR [E3B4],00
153C:63EF 74F9 JZ 63EA
153C:63F1 59 POP CX
153C:63F2 8306AAE307 ADD WORD PTR [E3AA],+07
153C:63F7 E2DA LOOP 63D3
153C:63F9 EA0000FFFF JMP FFFF:0000
153C:63FE 2E CS:
153C:63FF 803E5E6501 CMP BYTE PTR [655E],01
153C:6404 75CA JNZ 63D0
153C:6406 8CC8 MOV AX,CS
153C:6408 3D0010 CMP AX,1000
153C:640B 7405 JZ 6412
153C:640D EA0000FFFF JMP FFFF:0000
153C:6412 B000 MOV AL,00
153C:6414 A2B4E3 MOV [E3B4],AL
153C:6417 E84700 CALL 6461
153C:641A C436ACE3 LES SI,[E3AC]
153C:641E BF0000 MOV DI,0000
153C:6421 BBB9E3 MOV BX,E3B9
153C:6424 B9181B MOV CX,1B18
153C:6427 FB STI
153C:6428 803EB4E300 CMP BYTE PTR [E3B4],00
153C:642D 74F9 JZ 6428
153C:642F C3 RET
153C:6430 26 ES:
153C:6431 8A04 MOV AL,[SI]
153C:6433 D7 XLAT
153C:6434 E642 OUT 42,AL
153C:6436 B020 MOV AL,20
153C:6438 E620 OUT 20,AL
153C:643A 81F70100 XOR DI,0001
153C:643E 7511 JNZ 6451
153C:6440 46 INC SI
153C:6441 83FE10 CMP SI,+10
153C:6444 750B JNZ 6451
153C:6446 BE0000 MOV SI,0000
153C:6449 8CC0 MOV AX,ES
153C:644B 40 INC AX
153C:644C 8EC0 MOV ES,AX
153C:644E 49 DEC CX
153C:644F 7401 JZ 6452
153C:6451 CF IRET
153C:6452 C606B4E301 MOV BYTE PTR [E3B4],01
153C:6457 E461 IN AL,61
153C:6459 24FC AND AL,FC
153C:645B E661 OUT 61,AL
153C:645D E86900 CALL 64C9
153C:6460 CF IRET
153C:6461 FA CLI
153C:6462 1E PUSH DS
153C:6463 B80000 MOV AX,0000
153C:6466 8ED8 MOV DS,AX
153C:6468 A12000 MOV AX,[0020]
153C:646B A3B5E3 MOV [E3B5],AX
153C:646E A12200 MOV AX,[0022]
153C:6471 A3B7E3 MOV [E3B7],AX
153C:6474 B83064 MOV AX,6430
153C:6477 A32000 MOV [0020],AX
153C:647A 8CC8 MOV AX,CS
153C:647C A32200 MOV [0022],AX
153C:647F B0B2 MOV AL,B2
153C:6481 E643 OUT 43,AL
153C:6483 E83600 CALL 64BC
153C:6486 B000 MOV AL,00
153C:6488 E642 OUT 42,AL
153C:648A E82F00 CALL 64BC
153C:648D B000 MOV AL,00
153C:648F E642 OUT 42,AL
153C:6491 E82800 CALL 64BC
153C:6494 E461 IN AL,61
153C:6496 24FC AND AL,FC
153C:6498 0C03 OR AL,03
153C:649A E661 OUT 61,AL
153C:649C B036 MOV AL,36
153C:649E E643 OUT 43,AL
153C:64A0 E81900 CALL 64BC
153C:64A3 1F POP DS
153C:64A4 A0AAE3 MOV AL,[E3AA]
153C:64A7 E640 OUT 40,AL
153C:64A9 E81000 CALL 64BC
153C:64AC A0ABE3 MOV AL,[E3AB]
153C:64AF E640 OUT 40,AL
153C:64B1 E80800 CALL 64BC
153C:64B4 B090 MOV AL,90
153C:64B6 E643 OUT 43,AL
153C:64B8 E80100 CALL 64BC
153C:64BB C3 RET
153C:64BC E80000 CALL 64BF
153C:64BF E80000 CALL 64C2
153C:64C2 E80000 CALL 64C5
153C:64C5 E80000 CALL 64C8
153C:64C8 C3 RET
153C:64C9 FA CLI
153C:64CA 1E PUSH DS
153C:64CB B80000 MOV AX,0000
153C:64CE 8ED8 MOV DS,AX
153C:64D0 A1B5E3 MOV AX,[E3B5]
153C:64D3 A32000 MOV [0020],AX
153C:64D6 A1B7E3 MOV AX,[E3B7]
153C:64D9 A32200 MOV [0022],AX
153C:64DC B98A0F MOV CX,0F8A
153C:64DF 88C8 MOV AL,CL
153C:64E1 E640 OUT 40,AL
153C:64E3 88E8 MOV AL,CH
153C:64E5 E640 OUT 40,AL
153C:64E7 B020 MOV AL,20
153C:64E9 E620 OUT 20,AL
153C:64EB 1F POP DS
153C:64EC FB STI
153C:64ED C3 RET