Technical query: At whits end with writing in DOS

Ok I am at whits end here.

I have some disks I wish to copy. The problem is that in the middle of the disk, there are several unused disk sectors. These sectors are unformatted, and have not been recorded, and all the commercially available recorders either insert a dummy sector or simply fail.

After trying many different copy programs and even falling for a scam in one case (lost $40), I decided that I need to do this myself the old fashioned way.

I put a new (old) hard drive in my computer, and installed DOS 6.0

I dug out and installed my MASM 5.1 and sat down to make something to do what I want. (I would have done this inside of XP until I discovered that in XP the MSCDEX (2Fh) function’s 08h and 09h (absolute CD read and CD write) were disabled).

After a couple hours of refreshing my memory and writing a down and dirty knuckle dragging program to map out and record a custom image of a CD, I had success in this aspect. It was a slow and grueling project attempting to map out the disk, taking a total of about 9 hours to read each sector and create a map of all the recorded and unrecorded sectors. (There are in final count over 1000 of these unformatted and unrecorded sectors)

Now I have the data image stored, and the map stored.

So now to write the data back to a blank disk using my image and map to lay out all the sectors with the absolute write function…

The first sector… fails to write.

I check my code, it is all correct.

Granted, like I said, a knuckle dragging brute force thing, but it should have worked, except that it will not write to my cd burner (ATAPI).

I tried installing the ASPI.sys translator… not knowing exactly what that does, apparently it did nothing for me.

Does anyone have a clue how I can get this to record through dos?

Welcome to CD Freaks, Alexandria1378 :slight_smile:

Since this is a bit too advanced for the Newbie forum, I’ll transfer this to the Burning Software section here.

If you checked your code and it is correct, but yet things are not working, then I would guess that what you are trying to do is simply not possible. If it was possible and your code is correct, it would have worked. Otherwise, your code is not correct.

From the info you have given, it seems you have created your own unique format for a disc layout. You admitted below that it was a custom image of a CD. There is not much hope that anyone here will be able to tell you how to burn your own special format. More details might be very helpful.

RM

Have you tried using an editor such as Ashampoo Music Studio 3 or one of the other popular ones out there? If this disc is audio then you should be able to do your project in XP. Otherwise, there will be serious issues trying to use existing burning programs as suggested by other posters.

[QUOTE=RichMan;2126155]If you checked your code and it is correct, but yet things are not working, then I would guess that what you are trying to do is simply not possible. If it was possible and your code is correct, it would have worked. Otherwise, your code is not correct.

From the info you have given, it seems you have created your own unique format for a disc layout. You admitted below that it was a custom image of a CD. There is not much hope that anyone here will be able to tell you how to burn your own special format. More details might be very helpful.

RM[/QUOTE]

Yes it is a unique format… I mapped out the cd for good sectors and sectors that gave a read error. Then I copied the good sectors only, setting the AX register to 1508h. pointing to the buffer in the ES:BX pair and setting the DI:SI pair to the sector to read and calling with INT 2Fh… I followed my map without a problem.

When i put the blank disk into the writer, I basically reversed the procedure.

I read from the buffer file, and then setting up the function call using AX=1509h, stored the info to be written in the ES:BX pair. and the sectors to write using the DI:SI pair, then calling with INT 2Fh. Instead of writing, It returns a carry flag and fails to write to the absolute sector.

I might have mis-stated my question. The documentation says that the absolute disk write is a function of the MSCDEX, but is supposed to be for authoring systems, and my documentation was created before there were CD writers available to the general public.

I don’t need someone to explain to me how to write the images to the disk… I have that worked out.

I need help getting my writer to respond to the code.

I know that the MSCDEX loads the function pointers into memory so that when the INT is called, it will handle the process. I have tried to trace through the interrupt call and have failed miserably to trace it out. Part of this is because it fails so that won’t write and simply returns the error code and setting the carry flag. Does anyone know of open Assembler code to actually write to a CD writer that bypasses the 09 call of INT 2Fh or if I need to load some sort of translator like ASPI.SYS that will correctly handle the absolute write.

I have tried other software to simply copy the disk, like CDClone but it has run for like 20 hours without completing the copy or inserting dummy sectors where there is supposed to be an unwritten sector. If one of these had worked, i would not have come to try my own method of copying the disk… It is a data disk with some programs… not music.

What’s on the CDs that you want to copy?

Also, I’m a programmer and I’d love to see your code.

Sláinte

midders

Sorry Alexandria3178, I only understand C/C++/Basic etc… and not assembly. Hopefully someone else on this board will be able to help.

However, you mention that your original discs have unformatted or unused sectors. I’m confused by what you mean here. What type of formatting are you referring too? What type of discs are they (pressed, CD-R, CD-RW)?

To my knowledge, all burnt CDs (as well as pressed replicas) must occupy every sector from start of program area to leadout. Sure you can burn with TAO (track at once) but even the link blocks have some sort of structure defined. I’ve never seen a disc that recording simply stops for a while and then starts again. Drives would not be able to track such a disc.

Probably I misunderstand what you are describing.

RM

[QUOTE=RichMan;2126532]Sorry Alexandria3178, I only understand C/C++/Basic etc… and not assembly. Hopefully someone else on this board will be able to help.

However, you mention that your original discs have unformatted or unused sectors. I’m confused by what you mean here. What type of formatting are you referring too? What type of discs are they (pressed, CD-R, CD-RW)?

To my knowledge, all burnt CDs (as well as pressed replicas) must occupy every sector from start of program area to leadout. Sure you can burn with TAO (track at once) but even the link blocks have some sort of structure defined. I’ve never seen a disc that recording simply stops for a while and then starts again. Drives would not be able to track such a disc.

Probably I misunderstand what you are describing.

RM[/QUOTE]

The original is a pressed disk. Under MSCDEX you have the ability to do what is called an absolute read. you give it a sector number and it will read that sector. On this disk, there are some sectors that return a read error… This means that there is nothing written to this sector. The sector has no formatting info or written info. This is in the middle of the data files.

With all publicly available programs like Nero Adaptec, and Roxio, when it encounters this sort of sector it fails the read. If you chose to ignore this error, it will insert dummy information then write the ISO file as a continuous track including the dummy sector. When the programs are run, they look for the bad sector and no longer find it. Then the program aborts.

It is similar to how some software manufacturers would burn a spot on a disk with a laser to generate a read failure.

Now I am not sure how the disk are formatted and their drive structure, but under FAT16 and FAT32, there was the table telling the computer where to find the next block for each file.

On older systems like way back for the commodore 64, each sector header would tell the computer the next track and sector for a specific file. i am presuming that since a CD is a random access device, it has a similar method of mapping out the disk, and is stored on the TOC… I may be wrong.
Anyway…

[QUOTE=midders;2126515]What’s on the CDs that you want to copy?

Also, I’m a programmer and I’d love to see your code.

Sláinte

midders[/QUOTE]

Ok here it is,… please bear inmind, I am not a professional and it is only partially documented. I got tired of doing the documentation… and it is very rough, and it does not have all possible errors handled. I did the basics and tailored it to my situation.


	TITLE	ABSOLUTE READ
	DOSSEG	
	.MODEL	SMALL
	.STACK	100h
	.DATA	
BUFFER	DB	63504 DUP (?)
TCT	DD	0
RCT	DD	0
READCT	DD	0
READAMT	DB	0
RDERRCT	DD	0
FILE_A_H	DW	0
FILE_B_H	DW	0
FILE_A	DB	"c:	emp2\buffer.dat",0
FILE_B	DB	"c:	emp2\index.dat",0
READ_DRV	DW	0
WRT_DRV	DW	0
RETRYCT	DB	1
STSEG	DD	0
FULLCT	DD	333000
SEGL	DW	2352
WRTCT	DW	0
SEG27	DD	27
ERSEGCT	DW	0
FULL_CT	DB	0
ERR_BIT	DB	0
STUPID	DW	0
	.CODE	
START:	MOV	AX,@DATA
	MOV	DS,AX
	MOV	ES,AX
;*****************************		
;		
;		
;	CREATES THE BUFFER FILE AND STORES HANDLE	
;		
;		
;*****************************		
	MOV	AH,3Ch
	XOR	CX,CX
	MOV	DX,OFFSET FILE_A
	INT	21h
	MOV	FILE_A_H,AX
;*****************************		
;		
;		
;	CREATES THE INDEX FILE AND STORES HANDLE	
;		
;		
;*****************************		
	MOV	AH,3Ch
	XOR	CX,CX
	MOV	DX,OFFSET FILE_B
	INT	21h
	MOV	FILE_B_H,AX
;*****************************		
;		
;		
;	RESET THE READ AND TOTAL COUNTERS	
;		
;		
;*****************************		
	MOV	WORD PTR TCT[0],0
	MOV	WORD PTR TCT[2],0
	MOV	WORD PTR RCT[0],0
	MOV	WORD PTR RCT[2],0
;*****************************		
;		
;		
;	Checks for the CD drives	
;	stores the drive locations	
;		
;		
;*****************************		
	MOV	AX,1500h
	MOV	BX,0
	INT	2Fh
	CMP	BX,0
	JE	TERMDRVA
	MOV	READ_DRV,CX
	INC	CX
	MOV	WRT_DRV,CX
;*****************************		
;		
;		
;	Sets the start segment at initial value	
;		
;		
;*****************************		
	MOV	AX,WORD PTR TCT[0]
	MOV	WORD PTR STSEG[0],AX
	MOV	AX,WORD PTR TCT[2]
	MOV	WORD PTR STSEG[2],AX
;*****************************		
;		
;		
;	Does absolute read to create disk map	
;		
;		
;*****************************		
ARD:	INC	STUPID
	CMP	STUPID,16000
	JNE	ARD2
	MOV	STUPID,0
ARD2:	MOV	DI,WORD PTR TCT[0]
	MOV	SI,WORD PTR TCT[2]
	MOV	BX,OFFSET BUFFER
	MOV	CX,READ_DRV
	MOV	AX,1508h
	MOV	DX,1
	INT	2Fh
;*****************************		
;		
;		
;	Handle the read error	
;		
;		
;*****************************		
	JC	RD_ERR
;*****************************		
;		
;		
;	Check to see if read error count is zero	
;		
;		
;*****************************		
	CMP	WORD PTR RDERRCT[2],0
	JNE	TTT5
	CMP	WORD PTR RDERRCT[0],0
	JNE	TTT5
	JMP	TTT6
TERMDRVA:	JMP	TERMDRV
;*****************************		
;		
;	If the read error count is not Zero	
;	move the total count to the Start segment	
;		
;		
;*****************************		
TTT5:	CMP	ERSEGCT,20
	JLE	ERSG1
	MOV	ERR_BIT,1
	CALL	STEP_UP
	JMP	ARD
ERSG1:	MOV	ERSEGCT,0
	MOV	AX,WORD PTR TCT[0]
	MOV	WORD PTR STSEG[0],AX
	MOV	AX,WORD PTR TCT[2]
	MOV	WORD PTR STSEG[2],AX
	MOV	WORD PTR RDERRCT[0],0
	MOV	WORD PTR RDERRCT[2],0
;*****************************		
;		
;		
;	See if all segments are mapped	
;		
;		
;*****************************		
TTT6:	CALL	TOTAL_CT
	CMP	FULL_CT,1
;*****************************		
;		
;		
;	If last record jump to reading map	
;		
;		
;*****************************		
	JE	BUFF_WRT3
	JMP	TTT1
BUFF_WRT3:	JMP	BUFF_WRT
;*****************************		
;		
;	Increment read counter	
;		
;*****************************		
TTT1:	INC	WORD PTR RCT[0]
	CMP	WORD PTR RCT[0],0
	JNE	INCLP1
	INC	WORD PTR RCT[2]
;*****************************		
;		
;	Increment total counter	
;		
;*****************************		
INCLP1:	INC	WORD PTR TCT[0]
	CMP	WORD PTR TCT[0],0
	JNE	TCTIN1
	INC	WORD PTR TCT[2]
;*****************************		
;		
;	Increment segment pointers	
;		
;*****************************		
TCTIN1:	INC	DI
	CMP	DI,0
	JNE	ARD1
	INC	SI
ARD1:	JMP	ARD
TERMDRV:	JMP	TERMDRV2
;*****************************		
;		
;		
;	Verify read error Cycle 5 times	
;		
;		
;*****************************		
RD_ERR:	CALL	TOTAL_CT
	CMP	FULL_CT,1
	JE	BUFF_WRT
	DEC	RETRYCT
	CMP	RETRYCT,0
	JNE	TTT8
	JMP	TTT7
TTT8:	JMP	ARD
TTT7:	MOV	RETRYCT,1
	INC	WORD PTR RDERRCT[0]
	CMP	WORD PTR RDERRCT[0],0
	JNE	TTT4
	INC	WORD PTR RDERRCT[2]
TTT4:	INC	ERSEGCT
	CMP	WORD PTR RCT[0],0
	JNE	TTT2
	CMP	WORD PTR RCT[2],0
	JE	INCLP1A
TTT2:	MOV	CX,4
	MOV	DX,OFFSET STSEG
	CALL	WRIND
	MOV	CX,4
	MOV	DX,OFFSET RCT
	CALL	WRIND
	MOV	WORD PTR RCT[0],0
	MOV	WORD PTR RCT[2],0
INCLP1A:	CMP	ERSEGCT,20
	JLE	POIU
	CALL	STEP_UP
POIU:	JMP	INCLP1
;*****************************		
;		
;		
;	store good segments	
;		
;		
;*****************************		
BUFF_WRT:	MOV	AX,4200h
	MOV	BX,FILE_B_H
	XOR	CX,CX
	XOR	DX,DX
	INT	21h
	MOV	CX,4
	MOV	DX,OFFSET STSEG
	CALL	RDIND
	MOV	CX,4
	MOV	DX,OFFSET RCT
	CALL	RDIND
	MOV	DI,WORD PTR STSEG[0]
	MOV	SI,WORD PTR STSEG[2]
BUFLP:	CMP	WORD PTR RCT[2],0
	JNE	TTT3
	CMP	WORD PTR RCT[0],27
	JLE	SMLR
TTT3:	MOV	AX,WORD PTR RCT[0]
	MOV	DX,WORD PTR RCT[2]
	SUB	AX,WORD PTR SEG27[0]
	SBB	DX,WORD PTR SEG27[2]
	MOV	WORD PTR RCT[0],AX
	MOV	WORD PTR RCT[2],DX
	MOV	AX,1508h
	MOV	CX,READ_DRV
	MOV	DX,27
	MOV	BX,OFFSET BUFFER
	INT	2Fh
	MOV	DX,OFFSET BUFFER
	MOV	CX,63504
	CALL	WRBUF
	MOV	CX,27
SILP:	INC	DI
	CMP	DI,0
	JNE	NDLP
	INC	SI
NDLP:	LOOP	SILP
	CMP	WORD PTR RCT[0],0
	JNE	BUFLP
	CMP	WORD PTR RCT[2],0
	JNE	BUFLP
	JMP	BFLP
BUFF_WRT2:	JMP	BUFF_WRT
SMLR:	MOV	AX,1508h
	MOV	CX,READ_DRV
	MOV	DX,WORD PTR RCT[0]
	MOV	BX,OFFSET BUFFER
	INT	2Fh
	MOV	DX,OFFSET BUFFER
	MOV	BX,WORD PTR RCT[0]
	MOV	AX,2352
	MUL	BX
	MOV	CX,AX
	CALL	WRBUF
	XOR	WORD PTR RCT[0],0
BFLP:	CMP	WRTCT,0
	JNE	BUFF_WRT2
	MOV	AH,3Eh
	MOV	BX,FILE_A_H
	INT	21h
	MOV	AH,3Eh
	MOV	BX,FILE_B_H
	INT	21h
TERMA:	NOP	
TERMB:	NOP	
TERMDRV2:	NOP	
	MOV	AX,4C00h
	INT	21h
WRIND	PROC	NEAR
	MOV	AH,40h
	MOV	BX,FILE_B_H
	INT	21h
	INC	WRTCT
	RET	
WRIND	ENDP	
RDIND	PROC	NEAR
	MOV	AH,3Fh
	MOV	BX,FILE_B_H
	INT	21h
	DEC	WRTCT
	RET	
RDIND	ENDP	
WRBUF	PROC	NEAR
	MOV	AH,40h
	MOV	BX,FILE_A_H
	INT	21h
	RET	
WRBUF	ENDP	
TOTAL_CT	PROC	NEAR
	MOV	AX,WORD PTR FULLCT[0]
	CMP	WORD PTR TCT[0],AX
	JL	TTT10
	MOV	AX,WORD PTR FULLCT[2]
	CMP	WORD PTR TCT[2],AX
	JNE	TTT10
	MOV	FULL_CT,1
TTT10:	RET	
TOTAL_CT	ENDP	
STEP_UP	PROC	NEAR
	CMP	ERR_BIT,1
	JE	STU2
	MOV	AX,DI
	MOV	DX,SI
	ADD	AX,9
	ADC	DX,0
	MOV	DI,AX
	MOV	SI,DX
	MOV	AX,WORD PTR TCT[0]
	MOV	DX,WORD PTR TCT[2]
	ADD	AX,9
	ADC	DX,0
	MOV	WORD PTR TCT[0],AX
	MOV	WORD PTR TCT[2],DX
	JMP	STU
STU2:	MOV	AX,DI
	MOV	DX,SI
	SUB	AX,9
	SBB	DX,0
	MOV	DI,AX
	MOV	SI,DX
	MOV	AX,WORD PTR TCT[0]
	MOV	DX,WORD PTR TCT[2]
	SUB	AX,9
	SBB	DX,0
	MOV	WORD PTR TCT[0],AX
	MOV	WORD PTR TCT[2],DX
	MOV	ERR_BIT,0
	MOV	ERSEGCT,0
STU:	RET	
STEP_UP	ENDP	
	END	START




and the CD writing program that failed.....to write the disk

Notice there was a lot that I was able to re-use...




	TITLE	ABSOLUTE WRITE
	DOSSEG	
	.MODEL	SMALL
	.STACK	100h
	.DATA	
BUFFER	DB	63504 DUP (?)
RCT	DD	0
FILE_A_H	DW	0
FILE_B_H	DW	0
FILE_A	DB	"c:	emp2\buffer.dat",0
FILE_B	DB	"c:	emp2\index.dat",0
READ_DRV	DW	0
WRT_DRV	DW	0
STSEG	DD	0
WRTCT	DW	2
	.CODE	
START:	MOV	AX,@DATA
	MOV	DS,AX
	MOV	ES,AX
;*****************************		
;		
;		
;	OPENS THE BUFFER FILE AND STORES HANDLE	
;		
;		
;*****************************		
	MOV	AX,3D00h
	XOR	CX,CX
	MOV	DX,OFFSET FILE_A
	INT	21h
	MOV	FILE_A_H,AX
;*****************************		
;		
;		
;	OPENS THE INDEX FILE AND STORES HANDLE	
;		
;		
;*****************************		
	MOV	AX,3D00h
	XOR	CX,CX
	MOV	DX,OFFSET FILE_B
	INT	21h
	MOV	FILE_B_H,AX
;*****************************		
;		
;		
;	Checks for the CD drives	
;	stores the drive locations	
;		
;		
;*****************************		
	MOV	AX,1500h
	MOV	BX,0
	INT	2Fh
	MOV	READ_DRV,CX
	INC	CX
	MOV	WRT_DRV,CX
	MOV	AX,4200h
	MOV	BX,FILE_B_H
	XOR	CX,CX
	XOR	DX,DX
	INT	21h
TTT18:	MOV	CX,4
	MOV	DX,OFFSET STSEG
	CALL	RDIND
	MOV	CX,4
	MOV	DX,OFFSET RCT
	CALL	RDIND
	MOV	DI,WORD PTR STSEG[0]
	MOV	SI,WORD PTR STSEG[2]
BUFLP:	CMP	WORD PTR RCT[2],0
	JNE	TTT3
	CMP	WORD PTR RCT[0],27
	JLE	SMLR
TTT3:	MOV	AX,WORD PTR RCT[0]
	MOV	DX,WORD PTR RCT[2]
	SUB	AX,27
	SBB	DX,0
	MOV	WORD PTR RCT[0],AX
	MOV	WORD PTR RCT[2],DX
	MOV	DX,OFFSET BUFFER
	MOV	CX,63504
	CALL	RDBUF
	MOV	AX,1509h
	MOV	CX,WRT_DRV
	MOV	DX,27
	MOV	BX,OFFSET BUFFER
	INT	2Fh
	MOV	AX,DI
	MOV	DX,SI
	ADD	AX,27
	ADC	DX,0
	MOV	DI,AX
	MOV	SI,DX
	CMP	WORD PTR RCT[0],0
	JNE	BUFLP
	CMP	WORD PTR RCT[2],0
	JNE	BUFLP
	JMP	BFLP
BUFF_WRT2:	JMP	TTT18
SMLR:	MOV	BX,WORD PTR RCT[0]
	MOV	AX,2352
	MUL	BX
	MOV	CX,AX
	MOV	DX,OFFSET BUFFER
	CALL	RDBUF
	MOV	AX,1508h
	MOV	CX,WRT_DRV
	MOV	DX,WORD PTR RCT[0]
	MOV	BX,OFFSET BUFFER
	INT	2Fh
	MOV	WORD PTR RCT[0],0
BFLP:	CMP	WRTCT,0
	JNE	BUFF_WRT2
	MOV	AH,3Eh
	MOV	BX,FILE_A_H
	INT	21h
	MOV	AH,3Eh
	MOV	BX,FILE_B_H
	INT	21h
	MOV	AX,4C00h
	INT	21h
RDIND	PROC	NEAR
	MOV	AH,3Fh
	MOV	BX,FILE_B_H
	DEC	WRTCT
	INT	21h
	RET	
RDIND	ENDP	
RDBUF	PROC	NEAR
	MOV	AH,3Fh
	MOV	BX,FILE_A_H
	INT	21h
	RET	
RDBUF	ENDP	
	END	START

Alexandria3178, the unreadable sectors are not unformatted or unwritten (these things are pretty much impossible on any disc). They are written and formatted but with deliberate errors for the copy protection being used. One way to do this is to write the entire sector (including ECC/EDC codes) but this only works for CD. For DVD you do not have the option to write the EDC codes and inner and outer parities.

Another trick used by copy protections is to press replicas that have a certain data pattern on them that when read back by a drive, the DSV (digital sum value) will go off the chart and make the sectors return read errors. Many copy protections today use this method. The software will check to make sure that certain sectors have read errors before they allow you to use the software.

Your best option is to determine what copy protection is on your disc and then use the software that has been created to beat that protection. It’s all been done before so there is no reason to re-invent the wheel.

RM

[QUOTE=Alexandria3178;2126491]…I don’t need someone to explain to me how to write the images to the disk… I have that worked out.

I need help getting my writer to respond to the code…[/QUOTE]Sorry guys: I’ll move this to the[I] Optical Storage Technical Discussions[/I] forum.

Edit: Done. :slight_smile:

[QUOTE=Alexandria3178;2126491]
…When i put the blank disk into the writer, I basically reversed the procedure.

I read from the buffer file, and then setting up the function call using AX=1509h, stored the info to be written in the ES:BX pair. and the sectors to write using the DI:SI pair, then calling with INT 2Fh. Instead of writing, It returns a carry flag and fails to write to the absolute sector.

I might have mis-stated my question. The documentation says that the absolute disk write is a function of the MSCDEX, but is supposed to be for authoring systems, and my documentation was created before there were CD writers available to the general public.[/QUOTE]
I’ve tried this before (a very long time ago), unfortunately the write command never worked on any drive, and I think it is broken or it sent a generally unsupported write command. It was never fixed by MS who in the end decided to abandon it anyway.

Under pure DOS for writing to CDs you’ll need to use the DOS version of ASPI16 (16 bit) driver by Adaptec which only supports SCSI devices, but I’ve no experience with that. The author of CDRWin (GoldenHawk) has the most experience there I think.

If it’s a DOS box under Windows then you have the ability to use ASPI32 (Win 9x), or if under XP then (SPTI), so no need to use MSCDEX which don’t write anyway.

Hmm, tbh, it’s not that difficult to do all you want under Windows XP using MS’s SPTI functions and sending through raw CD drive commands (which are SCSI-3 commands).

The 1000 bad sectors are unreadable sectors, and it sounds like the old SafeDisc protection, which used about that many if I remember correctly. Well, CloneCD and a few others have already beaten that. All they did was when dumping, instead of replacing with dummy readable sector, they replaced with a dummy unreadable sector.

Well this is beginning to sound as though I am in way over my head here.

I just had some software that I purchased about 8years ago, and it cost me over $3500 that I use for my business. It is long past the upgrade stage, and to do that, i would need to pay the entire purchase price again, which is about $5000these days.

The CD is getting really ragged and I wanted to preserve it.

Thanks for all the input you have provided, and also thanks for helping me format the responses properly. I am not very experienced with forums and formating them properly. (Never would have guessed that there was a

 tag)

Alexia

Ops, we didn’t mean to scare you - just trying to pave the way for you.

I do have some samples in c that I wrote at:
www.cdtool.pwp.blueyonder.co.uk/workshop.htm

As for the

 tag, I agree, and I am happy to make the changes for you :).

Just a thought; was one of the programs you tried BlindRead/BlindWrite? I remember using this to copy CD’s with read errors in the past and you used to get a free trial period.

Thanks for the code, like RichMan I’m more of a high level guy, but I have dabbled in assembler and will enjoy looking through it.

Sláinte

midders

What programs did you try?

CloneCD also has a trial, and is perhaps the best known of the copy programs.
Alcohol is another possibility
And yes, Blindread/Blindwrite another

Most other programs claiming to “backup the uncopyable” are pale imitations or scams, but I’d be surprised if any of those 3 were given much trouble by an older protection.