⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0cd.asm

📁 硬盘模拟光驱,可以模拟多达八个光驱
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	je	@@IOCTLO	;	Yes	-->	@@IOCTLO
	cmp	al,15	;	Removable	media	?
	je	@@ErrRqz	;	Yes	-->	@@ErrRqz
	cmp	al,16	;	Output until busy	?
	je	@@ErrRqz	;	Yes	-->	@@ErrRqz
	cmp	al,129	;	Reserved ?
	je	@@ErrRqz	;	Yes	-->	@@ErrRqz
	cmp	al,132	;	Play audio ?
	je	@@Play	;	Yes	-->	@@Play
	cmp	al,133	;	Stop audio ?
	je	@@Stop	;	Yes	-->	@@Stop
	cmp	al,134	;	Read long	verify ?
	je	@@ErrRqz	;	Yes	-->	@@ErrRqz
	cmp	al,135	;	Write	long verify	?
	je	@@ErrRqz	;	Yes	-->	@@ErrRqz
	cmp	al,136	;	Resume audio ?
	je	@@Play	;	Yes	-->	@@Play
@@SuccessDev:
	mov	[word ptr es:bx+03],0100h	;	Set	success	status
	iret		;	Return to	interrupt	caller
@@Play:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	mov	[cs:CDPlaying],0000h	;	Set	flags
	jmp	@@SuccessDev	;	Success
@@Stop:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	mov	[cs:CDPlaying],0001h	;	Set	flags
	jmp	@@SuccessDev	;	Success
@@FailureDev:
	mov	[byte ptr es:bx+04],80h	;	Set	success	status
	mov	[byte ptr es:bx+03],al	;	Set	failure	code
	iret		;	Return to	interrupt	caller
@@IOCTLO:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	jmp	@@SuccessDev	;	Set success	status
@@IOCTLI:
	mov	[word ptr es:bx+03],0	;	Signal ok	for	now
	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	al,[es:bx]	;	Get	data command byte
	pop	bx es	;	Restore	registers

	cmp	al,0	;	Address	of device	header ?
	je	@@NotReady	;	Yes	-->	@@NotReady
	cmp	al,1	;	Location of	head ?
	je	@@HeadPos	;	Yes	-->	@@HeadPos
	cmp	al,4	;	Info about audio channels	?
	je	@@AudioChannelInfo	;	Yes	-->	@@AudioChannelInfo
	cmp	al,5	;	Read drive bytes ?
	je	@@NotReady	;	Yes	-->	@@NotReady
	cmp	al,6	;	Status of	device ?
	je	@@DeviceStatus	;	Yes	-->	@@DeviceStatus
	cmp	al,7	;	Size of	sectors	?
	je	@@SectorSize	;	Yes	-->	@@SectorSize
	cmp	al,8	;	Size of	disk ?
	je	@@VolumeSize	;	Yes	-->	@@VolumeSize
	cmp	al,9	;	MediaChanged ?
	je	@@MediaChanged	;	Yes	-->	@@MediaChanged
	cmp	al,10	;	Info about audio disk	?
	je	@@AudioDiskInfo	;	Yes	-->	@@AudioDiskInfo
	cmp	al,11	;	Info about audio track ?
	je	@@AudioTrackInfo	;	Yes	-->	@@AudioTrackInfo
	cmp	al,12	;	Info about Q-channel ?
	je	@@NotReady	;	Yes	-->	@@NotReady
	cmp	al,13	;	Info about sub-channel ?
	je	@@NotReady	;	Yes	-->	@@NotReady
	cmp	al,14	;	Get	UPC	Code ?
	je	@@UPCCode	;	Yes	-->	@@UPCCode
	cmp	al,15	;	Info about audio status	?
	je	@@AudioStatus	;	Yes	-->	@@AudioStatus
@@NotReady:
	mov	[word ptr es:bx+03],3+32768	;	Signal not ready
	iret		;	Return to	interrupt	caller
@@AudioStatus:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	push	ax es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	ax,[cs:CDPlaying]	;	Get	flags
	mov	[es:bx+1],ax	;	Set	flags
	pop	bx es ax	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@HeadPos:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	push	ax ds
	mov	ax,[cs:CDPos]	;	Get	old	position
	inc	ax	;	Move to	next position
	jnz	@@OkPos	;	Looped around	?
	mov	ax,0010h	;	Set	to start of	tracks
@@OkPos:
	mov	[cs:CDPos],ax	;	Store	for	next read
	mov	[es:bx+1],ax	;	Set	location
	mov	[word ptr es:bx+3],0000h	;	...
	pop	bx es	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@AudioChannelInfo:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	[word ptr es:bx+1],0FF00h	;	Set	channel	0
	mov	[word ptr es:bx+3],0FF01h	;	Set	channel	1
	mov	[word ptr es:bx+5],0FF02h	;	Set	channel	2
	mov	[word ptr es:bx+7],0FF03h	;	Set	channel	3
	pop	bx es	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@DeviceStatus:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	[word ptr es:bx+1],0000001110110110b	;	Set	status
	mov	[word ptr es:bx+3],00000h	;	...
	pop	bx es	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@SectorSize:
	push	ds si	;	Save registers
	mov	cl,[es:bx+1]	;	Get	drive	id
	add	cl,[cs:FirstID]	;	Convert	to A-Z
	call	GetData, cx	;	Get	data
	jc	@@NoSectorSize	;	No data	-->	@@NoSectorSize

	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	ax,[ds:si+4]	;	Get	sector size
	mov	[es:bx+1],ax	;	Store	sector size
	mov	al,[ds:si+6]	;	...
	mov	[es:bx+3],al	;	...
	pop	bx es si ds	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@NoSectorSize:
	pop	si ds	;	Restore	registers
	mov	al,17	;	Failure	code
	jmp	@@FailureDev	;	Failure
	iret		;	Return to	interrupt	caller
@@VolumeSize:
	push	ds si	;	Save registers
	mov	cl,[es:bx+1]	;	Get	drive	id
	add	cl,[cs:FirstID]	;	Convert	to A-Z
	call	GetData, cx	;	Get	data
	jc	@@NoVolumeSize	;	No data	-->	@@NoVolumeSize

	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	ax,[ds:si+7]	;	Get	volume size
	mov	[es:bx+1],ax	;	Store	volume size
	mov	ax,[ds:si+9]	;	...
	mov	[es:bx+3],ax	;	...
	pop	bx es si ds	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@NoVolumeSize:
	pop	si ds	;	Restore	registers
	cmp	[cs:DoFailure],01h	;	Failure	on exit	?
	jne	@@SuccessDev	;	No --> @@SuccessDev
	mov	al,17	;	Failure	code
	jmp	@@FailureDev
@@MediaChanged:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	[byte ptr es:bx+1],01h	;	Set	media	not	changed	flag
	pop	bx es	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@AudioDiskInfo:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	push	ds si	;	Save registers
	mov	cl,[es:bx+1]	;	Get	drive	id
	add	cl,[cs:FirstID]	;	Convert	to A-Z
	call	GetData, cx	;	Get	data
	jc	@@NoAudioDiskInfo	;	No data	-->	@@NoAudioDiskInfo

	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	ax,[ds:si+11]	;	Get	info data
	mov	[es:bx+1],ax	;	Store	info data
	mov	ax,[ds:si+13]	;	...
	mov	[es:bx+3],ax	;	...
	mov	ax,[ds:si+15]	;	...
	mov	[es:bx+5],ax	;	...
	pop	bx es si ds	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@NoAudioDiskInfo:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	pop	si ds	;	Restore	registers
	cmp	[cs:DoFailure],01h	;	Failure	on exit	?
	jne	@@SuccessDev	;	No --> @@SuccessDev
	mov	al,17	;	Failure	code
	jmp	@@FailureDev	;	Failure
@@AudioTrackInfo:
	cmp	[cs:AudioTru],01h	;	Audio	through-put	?
	je	@@CallOld	;	Yes	-->	@@CallOld
	push	ds si es bx	;	Save registers
	mov	cl,[es:bx+1]	;	Get	drive	id
	add	cl,[cs:FirstID]	;	Convert	to A-Z
	call	GetData, cx	;	Get	data
	jc	@@NoAudioTrackInfo	;	No data	-->	@@NoAudioTrackInfo
	add	si,161	;	Adjust offset
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	al,[es:bx+1]	;	Get	track	no
	cmp	al,[ds:si]	;	Track	<	first	track	on cd	?
	jb	@@NoAudioTrackInfo	;	Yes	-->	@@NoAudioTrackInfo
	cmp	al,[ds:si+1]	;	Track	>	last track on	cd ?
	ja	@@NoAudioTrackInfo	;	Yes	-->	@@NoAudioTrackInfo
	add	si,2	;	Adjust offset
	sub	al,[ds:si-2]	;	Make track 0-based
	cmp	al,0	;	First	track	?
	je	@@ReadTrackInfo	;	Yes	-->	@@ReadTrackInfo
@@SkipLoop:
	add	si,5	;	Adjust offset
	dec	al	;	Next track
	jnz	@@SkipLoop	;	More --> @@SkipLoop
@@ReadTrackInfo:
	mov	ax,[ds:si]	;	Get	track	info data
	mov	[es:bx+2],ax	;	Store	track	info data
	mov	ax,[ds:si+2]	;	...
	mov	[es:bx+4],ax	;	...
	mov	al,[ds:si+4]	;	...
	mov	[es:bx+6],al	;	...
	pop	bx es si ds	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@NoAudioTrackInfo:
	pop	bx es si ds	;	Restore	registers
	cmp	[cs:DoFailure],01h	;	Failure	on exit	?
	jne	@@SuccessDev	;	No --> @@SuccessDev
	mov	al,17	;	Failure	code
	jmp	@@FailureDev	;	Failure
@@UPCCode:
	push	ds si	;	Save registers
	mov	cl,[es:bx+1]	;	Get	drive	id
	add	cl,[cs:FirstID]	;	Convert	to A-Z
	call	GetData, cx	;	Get	data
	jc	@@NoUPCCode	;	No data	-->	@@NoUPCCode

	push	es bx	;	Save registers
	les	bx,[es:bx+14]	;	Get	pointer	to data
	mov	ax,[ds:si+17]	;	Get	upc	code
	mov	[es:bx+1],ax	;	Store	upc	code
	mov	ax,[ds:si+19]	;	...
	mov	[es:bx+3],ax	;	...
	mov	ax,[ds:si+21]	;	...
	mov	[es:bx+5],ax	;	...
	mov	ax,[ds:si+23]	;	...
	mov	[es:bx+7],ax	;	...
	mov	ax,[ds:si+25]	;	...
	mov	[es:bx+9],ax	;	...
	pop	bx es si ds	;	Restore	registers
	jmp	@@SuccessDev	;	Success
@@NoUPCCode:
	pop	si ds	;	Restore	registers
	mov	al,17	;	Failure	code
	jmp	@@FailureDev	;	Failure
@@ErrRqz:
	mov	[word ptr es:bx+03],3+32768	;	Set	invalid	request	code
	iret		;	Return to	interrupt	caller
@@GetDirEntry:
	iCLC		;	Signal success
	mov	[byte ptr es:bx],0	;	Zero pathname
	push	es	;	Save register
	mov	es,si	;	Get	segment
	mov	[byte ptr es:di+26],0	;	Zero pathname
	mov	[byte ptr es:di+27],0	;	Zero pathname
	pop	es	;	Restore	register
	mov	ax,1	;	ISO9660	cd format
	iret		;	Return to	interrupt	caller
@@DriveList:
	push	cx bx	;	Save registers
	mov	cl,[cs:FirstID]	;	Get	first	id
	sub	cl,'A'	;	Calculate	first drive	no
	mov	ch,[cs:DriveCount]	;	Get	number of	drives
@@DriveLoop:
	mov	[es:bx],cl	;	Store	drive	no
	inc	bx	;	Next drive no
	dec	ch	;	One	less drive
	jnz	@@DriveLoop	;	More --> @@DriveLoop
	pop	bx cx	;	Restore	registers
	iCLC		;	Success
	iret		;	Return to	interrupt	caller
@@GetVersion:
	mov	bx,0217h	; Version 2.23 (mscdex)
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@DriveCheck:
	mov	bx,cx	;	Get	drive	id
	add	bl,'A'	;	Convert	to A-Z
	cmp	bl,[cs:FirstID]	;	Our	drive	?
	jb	@@NotACD	;	No --> @@NotACD
	cmp	bl,[cs:LastID]	;	Our	drive	?
	ja	@@NotACD	;	No --> @@NotACD
	mov	al,01h	;	Signal cd	rom
	jmp	@@RetIt	;	Return it
@@NotACD:
	mov	al,00h	;	Signal not a cd	rom
@@RetIt:
	mov	bx,0adadh	;	Set	extensions supported
	mov	ah,00h	;	Zero high	8	bit	of return
	iret		;	Return to	interrupt	caller
@@DeviceList:
	push	ax bx cx si di	;	Save registers
	lea	si,[DeviceHdr]	;	ds:si	=	DeviceHdr
	mov	cl,[cs:DriveCount]	;	Get	number of	drives
	xor	ax,ax	;	Zero ax
	xor	di,di	;	Zero di
@@DeviceLoop:
	mov	[es:bx],al	;	Store	subunit no
	mov	[es:bx+3],si	;	Store	offset of	device
	mov	[es:bx+1],di	;	Store
	inc	al
	add	bx,5	;	Next entry
	dec	cl	;	One	less drive
	jnz	@@DeviceLoop	;	More --> @@DeviceLoop
	pop	di si cx bx ax	;	Restore	registers
	iret		;	Return to	interrupt	caller
@@CheckInstall:
	cmp	bx,0	;	Check	?
	jne	@@CallOld	;	No --> @@CallOld
	xor	ch,ch	;	Zero high	8	bit
	mov	cl,[cs:FirstID]	;	Get	drive	id
	sub	cl,'A'	;	Make 0-based
	xor	bh,bh	;	No more	than 255 drives!
	mov	bl,[cs:DriveCount]	;	Get	drivecount
	iret		;	Return to	interrupt	caller
@@GetFileName:
	push	ds si	;	Save registers
	add	cl,'A'	;	Make id	A-Z
	call	GetData, cx	;	Get	data
	jc	@@NoCD	;	No data	-->	@@NoCD
	add	si,27	;	Adjust offset
@@ReadIt:
	cmp	al,02h	;	Need to	adjust offset	?
	je	@@OkRead	;	No --> @@OkRead
	add	si,38	;	Adjust offset
	dec	al	;	Adjust counter
	jmp	@@ReadIt	;	Loop
@@OkRead:
	push	bx cx	;	Save register
	mov	cx,38	;	Number of	characters to	copy
	cld		;	Forward	copy
	rep	movsb	;	Copy filename
	pop	cx bx si ds	;	Restore	registers
	iCLC		;	Signal success
	iret		;	Return to	interrupt	caller
@@NoCD:
	pop	si ds	;	Restore	registers
	cmp	[cs:DoFailure],01h	;	Failure	on exit	?
	jne	@@Dummy	;	No --> @@Dummy
	iSTC		;	Signal failure
	mov	ax,000fh	;	Drive	not	ready	error
	jmp	@@Exit	;	Exit
@@CheckMSCDEX:
	push	bp	;	Save bp
	mov	bp,sp	;	Point	bp to	sp
	cmp	[word ptr bp+8],0dadah	;	Installation check ?
	je	@@YesMSCDEX	;	Yes	-->	@@YesMSCDEX
	pop	bp	;	Restore	bp
	jmp	@@CallOld	;	Call old handler
@@YesMSCDEX:
	mov	[word ptr bp+8],0adadh	;	Adjust stack
	pop	bp	;	Restore	bp
	cmp	si,'0C'	;	Self-check ?
	jne	@@NotSelf	;	No --> @@NotSelf
	cmp	di,'D7'	;	Self-check ?
	jne	@@NotSelf	;	No --> @@NotSelf
	mov	si,'7D'	;	Adjust si
	mov	di,'C0'	;	and	di
	push	cs	;	Put	code segment
	pop	es	;	into es
@@NotSelf:
	mov	al,0ffh	;	Signal success
@@Exit:
	iret		;	Return to	interrupt	caller
@@DelaySize	dw	3200
@@OldAX	dw	0
endp

; GetSpeed procedure
proc	GetSpeed
arg	@@DriveID:word
uses	bx
	mov	bl,[byte ptr @@DriveID]	;	Get	Drive	ID
	sub	bl,[cs:FirstID]	;	Make 0-based
	xor	bh,bh	;	Zero high	8	bit	(make	index)
	shl	bx,1	;	Make word-index
	mov	ax,[cs:DriveSpeeds+bx]	;	Get	drive	speed	from table
	ret		;	Return to	caller
endp

; SetIntVec	procedure
proc	SetIntVec
arg	@@IntNo:word, @@Vector:dw

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -