📄 0cd.asm
字号:
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 + -