;Symphony ver 1.0, 1.1 and lotus 123 unprotect with out mods to pgm ;Change name to ld12.asm ;modified for 1.1 by P.B. 08/30/85 ; ;================================================= ;For SYMPHONY 1.1 : ; ; LD program will read a disk in a drive that is ; loged on during loading of SYMPHONY 1.1. ; You may optionally specify drive that is to be ; examined during initial execution of SYMPHONY ; D>LD C: will always check drive C: ; This optional drive can be changed at any time ; by re-executing LD n: ; ;This is a part of COPY UN-PROTECT. ;================================================= CSEG SEGMENT ASSUME DS:CSEG, SS:CSEG ,CS:CSEG ,ES:CSEG ORG 5CH FCB DB 0 ORG 0100H FIRST: JMP INIT BCKADR DB 4 DUP(0) SERIAL DB ' (no serial #) ' TEMP DB 0 UNPROT PROC FAR STI CMP CL,19H JNZ UNPR1 PUSH DS PUSH SI PUSH DI PUSH CX PUSH CS POP DS MOV SI,OFFSET SERIAL MOV DI,BX MOV CX,0FH CLD REPZ MOVSB POP CX POP DI POP SI POP DS JMP NOSER UNPR1: CMP CL,20H ;' ' JZ UNPR2 CMP CL,30H ;'0' JZ UNPR2 CMP CL,40H ;'@' JNZ UNPR3 UNPR2: MOV AH,10H JMP UNPR7 UNPR3: PUSH BP MOV BP,SP CMP WORD PTR [BP+2],OFFSET 0A8ABH JZ UNPR4 CMP WORD PTR [BP+2],OFFSET 0A88BH JZ UNPR4 CMP WORD PTR [BP+2],OFFSET 66F4H JZ UNPR5 ;SYMPHONY 1.1 ------------------- CMP DL,0 ;access drive a? JNZ GBACK ;no.. CMP AH,2 ;read function? JNZ GBACK ;no.. CMP CS:TEMP,63H ;was last request for sector 63h? JZ DO11 ;yes.. CMP CS:TEMP,DL ;is the counter 0? (dl is 0) JNZ DO11X ;no, do not read disk CMP CL,63H ;is the requested sector 63h? JNZ GBACK ;no, just a regular read request.. MOV CS:TEMP,CL ;save it as a flag PUSH AX MOV AL,CS:FCB ;see if user indicated drive? OR AL,AL JNZ HAVE ;yes... MOV AH,19H ;get the current drive INT 21H INC AL HAVE: CMP AL,2 ;above B:? JG HARDD ;yes.. DEC AL SAVEIT: MOV BYTE PTR CS:DRIVE,AL ;store the default JMP SHORT NODRV HARDD: CMP AL,4 ;above D:? JG NODRV ;yes, that's no good SUB AL,3 OR AL,80H ;make it hard drive JMP SHORT SAVEIT NODRV: POP AX MOV DL,0 ;force hard disk 80=c: , 81=d: ;if no hard disk, then will have to re-execute ;SYMPHONY few times until it comes up DRIVE EQU $-1 JMP SHORT GBACK1 ;it works for some reason DO11: MOV CS:TEMP,CL ;save sector number (will use it as counter) DO11X: DEC CS:TEMP ;decrement count JMP SHORT UNPR5 ;return with carry clear (read ok) ;SYMPHONY 1.1 ================== GBACK: MOV BYTE PTR CS:TEMP,0 ;clear counter (just in case) GBACK1: POP BP JMP SHORT BACK UNPR4: CMP CL,8 JNZ UNPR6 UNPR5: XOR AH,AH POP BP NOSER: CLC RET 2 UNPR6: MOV AH,2 POP BP UNPR7: STC RET 2 BACK: JMP DWORD PTR CS:BCKADR UNPROT ENDP INIT PROC NEAR CLI PUSH CS POP ES MOV CL,FCB PUSH DS MOV SI,4CH XOR AX,AX MOV DS,AX MOV DI,OFFSET BCKADR CMP WORD PTR [SI],OFFSET UNPROT JNZ DOIT OR CL,CL JZ INI2 MOV AX,[SI+2] MOV ES,AX MOV ES:FCB,CL INI2: POP DS MOV DX,OFFSET MSG2 MOV AH,9 INT 21H RET DOIT: MOV CX,4 CLD REPZ MOVSB POP DS PUSH DS MOV DX,OFFSET MSG1 MOV AH,9 INT 21H MOV DX,OFFSET UNPROT MOV AX,2513H INT 21H POP DS MOV DX,OFFSET init STI INT 27H MSG1 DB 'LD 1.2 UNPROTECT for SYMPHONY 1.0 & 1.1, LOTUS now resident.' DB 0DH,0AH DB 'Usage: LD [d:]$' MSG2 DB 'LD already loaded.$' INIT ENDP CSEG ENDS ; END FIRST