;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ comment @ ' ██████┐ █████┐ ██████┐ ██████┐ █┐ █┐ ██┌───┘ ██┌─██┐ ██┌─██│ ██┌─██│ ██┐ ██│ ' ██│ ██│ ██│ ██████│ ██│ ██│ ██████│ ██│ ██│ ██│ ██┌██┌┘ ██│ ██│ ██┌─██│ ' ██████┐ █████┌┘ ██│└██┐ ██████│ ██│ ██│ ' └─────┘ └────┘ └─┘ └─┘ └─────┘ └─┘ └─┘ ' ' 25 Juillet 1994 ' (c) Adeline Software International 1994 @ ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JUMPS .386P .model SMALL, C ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .data public NoLanguage LeadOut public NoLanguage LowTrack public NoLanguage HigTrack public NoLanguage BufferData public NoLanguage CptTimeOut public NoLanguage DriveCDR public NoLanguage FileCD_Start public NoLanguage FileCD_Sect public NoLanguage FileCD_Size TIME_OUT equ 10 FileCD_Start dd 0 FileCD_Sect dd 0 FileCD_Size dd 0 LowTrack db 0 HigTrack db 0 LeadOut dd 0 DriveCDR dw -2 BufferData db 1000 dup(0) CptTimeOut dw 0 PtDosCD dd ? ;' Pointeur Prot sur Dos Mem OffDosCd dw ? ;' Offset Real sur Dos Mem ;----------------------------------' PtDosCD : Structure IOCTL I_LENHDR equ 0 ;' Byte 1 I_SUBUNIT equ 1 ;' Byte 1 I_COMMAND equ 2 ;' Byte 1 I_STATUS equ 3 ;' Word 1 I_RESERVED equ 5 ;' Byte 8 I_MEDIA equ 13 ;' Byte 1 I_TRANSPTR equ 14 ;' Long 1 I_NBBYTE equ 18 ;' Word 1 I_STARTING equ 20 ;' Word 1 I_PTRREQUEST equ 22 ;' Long 1 I_DUMM equ 26 ;' Byte 500 ;----------------------------------' PtDosCD : End IOCTL, Begin BUFFERDATA I_BUFFERDATA equ 540 ;' Byte 1000 I_SIZE equ 1540 ;----------------------------------' PtDosCD : End BUFFERDATA RMI equ $ RMI_EDI dd 0 RMI_ESI dd 0 RMI_EBP dd 0 RMI_RESERVED dd 0 RMI_EBX dd 0 RMI_EDX dd 0 RMI_ECX dd 0 RMI_EAX dd 0 RMI_flags dw 0 RMI_ES dw 0 RMI_DS dw 0 RMI_FS dw 0 RMI_GS dw 0 RMI_IP dw 0 RMI_CS dw 0 RMI_SP dw 0 RMI_SS dw 0 ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .code public NoLanguage InitCDR public NoLanguage ClearCDR public NoLanguage GetCopyrightName public NoLanguage Red2Hsg public NoLanguage GetLengthTrackCDR public NoLanguage StartTrackCDR public NoLanguage ResumeCDR public NoLanguage EjectCDR public NoLanguage CloseTrayCDR public NoLanguage LockCDR public NoLanguage UnLockCDR public NoLanguage StatusCDR public NoLanguage GetMusicCDR public NoLanguage ResetCDR public NoLanguage ControlCDR public NoLanguage LocateHeadCDR public NoLanguage PlayCDR public NoLanguage StopCDR public NoLanguage PlayTrackCDR public NoLanguage ReadLongCDR public NoLanguage GetBitCDR public NoLanguage WaitDisk ;' public NoLanguage TestCDROM public NoLanguage GetFileCDR ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TalkCDR_O proc uses ebx es mov ebx, [PtDosCD] mov word ptr [ebx+I_STATUS], 0 mov RMI_EAX, 1510h movzx eax, DriveCDR mov RMI_ECX, eax mov bx, [OffDosCD] mov RMI_ES, bx mov RMI_EBX, 0 mov ax, ds mov es, ax mov edi, offset RMI mov ax, 300h mov bx, 2fh int 31h mov ebx, [PtDosCD] mov eax, [ebx+I_STATUS] ret TalkCDR_O endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AudioInfoCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 3 ;' Command Input mov word ptr [ebx+I_NBBYTE], 7 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov [ebx+I_TRANSPTR], ax ;' Offset mov ax, [OffDosCD] mov [ebx+I_TRANSPTR+2], ax ;' Segment mov byte ptr [ebx+I_BUFFERDATA], 10 ;' Audio Info Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry xor ax, ax ret NoError: mov ebx, [PtDosCD] mov al, [ebx+I_BUFFERDATA+1] mov ah, [ebx+I_BUFFERDATA+2] mov [LowTrack], al mov [HigTrack], ah mov eax, [ebx+I_BUFFERDATA+3] mov [LeadOut], eax mov ax, 1 ret AudioInfoCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ WaitDisk proc local timeout:DWORD mov [timeout], 256*3 Again: call StatusCDR test ax, 100000000000b ;' Disk Present ? je OkDisk dec [timeout] jne Again OkDisk: xor ax, ax ret WaitDisk endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ InitCDR proc uses es esi edi ebx,\ nameid:DWORD local nbcddrive:WORD local listdrive[26]:BYTE local lennameid:DWORD local save_ecx:DWORD local timeout:DWORD mov [DriveCDR], -2 ;' Default No CD Drive xor bx, bx mov ax, 1500h ;' Get Drive Number int 2Fh or bx, bx je NoCDRom mov [nbcddrive], bx mov [DriveCDR], cx ;----------------------'Init PtDosCD en Mem Dos par DPMI mov eax, 0100h ;' Dmpi Alloc Mem Dos mov ebx, 128 ;' 2048 ( 128*16 ) int 31h mov [OffDosCD], ax shl eax, 4 ;' Con real->Prot mov [PtDosCD], eax ;----------------------'Calcul Taille nameid mov edi, nameid ;' Len of nameid mov ecx, 0FFh xor al, al repne scasb ;' Size+1 of nameid sub ecx, 0FFh neg ecx dec ecx ;' Without 0 for "" mov [lennameid], ecx ;----------------------'Recup List CD Drive & Copy in listdrive mov RMI_EAX, 150Dh ;' Get List CD Drive mov bx, [OffDosCD] mov RMI_ES, bx mov RMI_EBX, 0 mov ax, ds mov es, ax mov edi, offset RMI mov ax, 300h mov bx, 2fh int 31h ;' ES:BX List Letter mov cx, [nbcddrive] mov esi, [PtDosCD] lea edi, listdrive rep movsb ;' Save List CD Drive ;----------------------'Scan des lecteurs CD pour trouver nameid lea ebx, listdrive xor ecx, ecx NextCDDrive: mov [save_ecx], ecx xor eax, eax mov al, [ebx+ecx] ;' Recup Drive Letter mov [DriveCDR], ax call CloseTrayCDR ;' CLOSETRAYCDR jne NotGoodOne ; call WaitDisk ;' WAITDISK jne NotGoodOne call LockCDR ;' LOCKCDR call StopCDR ;' STOPCDR call StatusCDR ;' STATUSCDR 1ere test ax, 8000h ;' Error je NoError call ResetCDR ;' RESETCDR call StatusCDR ;' STATUSCDR 2eme test ax, 8000h jne NotGoodOne NoError: jne NotGoodOne ;' Can t close cmp [lennameid], 0 je TheGoodOne ;' No Copyright test call GetCopyrightName ;' GETCOPYRIGHTNAME mov esi, eax ;' Copyright Name mov edi, nameid mov ecx, [lennameid] rep cmpsb ;' Compar with Copyright je TheGoodOne NotGoodOne: call UnLockCDR mov ecx, [save_ecx] inc ecx cmp cx, [nbcddrive] jne NextCDDrive jmp NoCDRom ;----------------------'GOTCHA :-) TheGoodOne: call StatusCDR test ax, 2048 ;' Pas de CD jne NoCDRom GetAudio: call AudioInfoCDR or ax, ax je GetAudio ;' Ca doit passer! mov eax, 1 ret NoCDRom: cmp [DriveCDR], -2 ;' No CD Drive je ContError mov [DriveCDR], -1 ;' No Adeline CD ContError: call UnLockCDR ;' UNLOCKCDR xor eax, eax ;' No CDRom ret InitCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ClearCDR proc call StopCDR call UnLockCDR call ResetCDR ret ClearCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetCopyrightName proc uses ebx mov RMI_EAX, 1502h ;' Get List CD Drive mov bx, [OffDosCD] mov RMI_ES, bx mov RMI_EBX, 0 mov ax, ds mov es, ax mov edi, offset RMI mov ax, 300h mov bx, 2fh int 31h ;' ES:BX List Letter mov eax, [PtDosCD] ret GetCopyrightName endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Red2Hsg proc ,\ value:DWORD mov eax, value and eax, 00FF0000h ;' Recup Min shr eax, 14 ;' Normal 16 mais... mov edx, eax ;' ebx=v*4 shl eax, 4 ;' *64 ( eh oui! ) sub eax, edx ;' min*60 mov edx, value and edx, 0000FF00h ;' Recup Sec shr edx, 8 ;' >> 8 add eax, edx ;'min*60+sec mov edx, 75 ;' flemme decalage :-( imul edx ;'(min*60+sec)*75 mov edx, value and edx, 000000FFh ;' Recup frame (100e) add eax, edx ;'(min*60+sec)*75+frame ret Red2Hsg endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetLengthTrackCDR proc uses ebx,\ track:DWORD local begin:DWORD mov ecx, [track] push ecx call StartTrackCDR ;' b = Debut Track pop ecx mov [begin], eax mov ebx, [LeadOut] cmp cl, [HigTrack] jge OkLastOne inc ecx push ecx call StartTrackCDR ;' e = Debut Track+1 add esp, 4 mov ebx, eax OkLastOne: push ebx call Red2Hsg mov ebx, eax push [begin] call Red2Hsg add esp, 8 sub ebx, eax ;' R2H(b)-R2H(e) mov eax, ebx ret GetLengthTrackCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ StartTrackCDR proc uses ebx,\ Track:DWORD mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 3 ;' Command Input mov word ptr [ebx+I_NBBYTE], 7 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 11 ;' Audio Info mov eax, Track mov byte ptr [ebx+I_BUFFERDATA+1], al Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry NoError: mov ebx, [PtDosCD] mov eax, dword ptr [ebx+I_BUFFERDATA+2] ret StartTrackCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ResumeCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 mov byte ptr [ebx+I_COMMAND], 136 Retry: call TalkCDR_O test ax, 8000h ;' Bit 15 jz NoError dec [CptTimeOut] jne Retry NoError: ret ResumeCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EjectCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 12 ;' Command IOCTLO mov word ptr [ebx+I_NBBYTE], 1 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 0 ;' Command Eject Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry NoError: ret EjectCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CloseTrayCDR proc uses ebx local timeout:DWORD call StatusCDR test ax, 1 ;' Door je OkRoule ;' Aready Closed! ;------------------------------------------------------- mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 12 ;' Command IOCTLO mov word ptr [ebx+I_NBBYTE], 1 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 5 ;' Command CloseTray Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry ret NoError: ;------------------------------------------------------- mov [timeout], 512 Again_0: call StatusCDR test ax, 1b ;' Door je OkRoule dec [timeout] jne Again_0 ;------------------------------------------------------- ret OkRoule: xor eax, eax ret CloseTrayCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LockCDR proc mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 12 ;' Command IOCTLO mov word ptr [ebx+I_NBBYTE], 2 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 1 ;' Command Lock Unlock mov byte ptr [ebx+I_BUFFERDATA+1], 1;' Lock Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry NoError: ret LockCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UnLockCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 12 ;' Command IOCTLO mov word ptr [ebx+I_NBBYTE], 2 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 1 ;' Command Lock Unlock mov byte ptr [ebx+I_BUFFERDATA+1], 0;' Lock Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry NoError: ret UnLockCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ StatusCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 3 ;' Command IOCTLI mov word ptr [ebx+I_NBBYTE], 5 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 6 ;' Command Status mov dword ptr [ebx+I_BUFFERDATA+1], 0;' Status Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry xor eax, eax ret NoError: mov ebx, [PtDosCD] movzx eax, word ptr [ebx+I_BufferData+1] ret StatusCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetMusicCDR proc uses ebx mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 3 ;' Command IOCTLI mov word ptr [ebx+I_NBBYTE], 11 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 0Ch;' Locate Head Retry: call TalkCDR_O test ax, 8000h jz NoError NoPlay: xor eax, eax ret NoError: mov ebx, [PtDosCD] test ax, 200h ;' Buzy jz NoPlay movzx eax, byte ptr [ebx+I_BufferData+2];' Num Track ret GetMusicCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetBitCDR proc uses ebx mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 3 ;' Command IOCTLI mov word ptr [ebx+I_NBBYTE], 5 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 6 ;' Command Status mov dword ptr [ebx+I_BUFFERDATA+1], 0;' Status call TalkCDR_O ret GetBitCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ResetCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 26 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 12 ;' Command IOCTLO mov word ptr [ebx+I_NBBYTE], 1 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 2 ;' Command Reset Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry NoError: ret ResetCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ControlCDR proc uses ebx,\ chan0:WORD, vol0:WORD, chan1:WORD, vol1:WORD mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 12 ;' Command IOCTLO mov word ptr [ebx+I_NBBYTE], 9 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 3 ;' Command Control mov ax, chan0 mov byte ptr [ebx+I_BUFFERDATA+1], al mov ax, vol0 mov byte ptr [ebx+I_BUFFERDATA+2], al mov ax, chan1 mov byte ptr [ebx+I_BUFFERDATA+3], al mov ax, vol1 mov byte ptr [ebx+I_BUFFERDATA+4], al Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry NoError: ret ControlCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LocateHeadCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 3 ;' Command Input mov word ptr [ebx+I_NBBYTE], 6 ;' Nb Byte Sub Funct mov byte ptr [ebx+I_MEDIA], 1 ;' Mode Red Book mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 1 ;' Command Locate mov byte ptr [ebx+I_BUFFERDATA+1], 0;' Mode Address Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry NoError: mov ebx, [PtDosCD] mov eax, dword ptr [ebx+I_BUFFERDATA+2] ret LocateHeadCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PlayCDR proc uses ebx,\ Debut:DWORD, Duree:DWORD mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] Retry: mov byte ptr [ebx+I_LENHDR], 26 ;' Len mov byte ptr [ebx+I_COMMAND], 132 ;' Play mov byte ptr [ebx+I_MEDIA], 1 ;' Mode Red Book ;----------------------- mov eax, Duree mov dword ptr [ebx+I_NBBYTE], eax mov eax, Debut mov dword ptr [ebx+I_TRANSPTR], eax ;----------------------- call TalkCDR_O test ax, 200h ;' Buzy bit 9 jnz Ok dec word ptr [CptTimeOut] jne Retry mov eax, 1 ret Ok: xor eax, eax ret PlayCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ StopCDR proc uses ebx mov [CptTimeOut], TIME_OUT mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 mov byte ptr [ebx+I_COMMAND], 133 Retry: call TalkCDR_O test ax, 8000h ;' Bit 15 jz NoError dec [CptTimeOut] jne Retry NoError: ret StopCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PlayTrackCDR proc uses ebx,\ Track:DWORD local len:DWORD push [track] call GetLengthTrackCDR add esp, 4 mov [len], eax mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 13 ;' Longueur Command mov byte ptr [ebx+I_COMMAND], 3 ;' Command Input mov word ptr [ebx+I_NBBYTE], 7 ;' Nb Byte Sub Funct mov ax, I_BUFFERDATA mov word ptr [ebx+I_TRANSPTR], ax mov ax, [OffDosCD] mov word ptr [ebx+I_TRANSPTR+2], ax mov byte ptr [ebx+I_BUFFERDATA], 11 ;' Audio Info mov eax, Track mov byte ptr [ebx+I_BUFFERDATA+1], al Retry: call TalkCDR_O test ax, 8000h jz NoError dec [CptTimeOut] jne Retry ret NoError: push [len] mov eax, dword ptr [ebx+I_BUFFERDATA+2] push eax call PlayCDR add esp, 8 ret PlayTrackCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ comment @ TestCDROM proc uses ebx xor eax, eax mov ebx, 1 push eax push [PtDosCD] push ebx push eax call ReadLongCDR add esp, 4*4 or eax, eax je NoError xor eax, eax ret NoError: mov eax, 1 ret TestCDROM endp @ ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ReadLongCDR proc uses es esi edi ebx,\ Start:DWORD, \ NbSect:DWORD, \ BufferTrans:DWORD mov [CptTimeOut], TIME_OUT Error: mov ebx, [PtDosCD] mov byte ptr [ebx+I_LENHDR], 27 ;' 27 Len mov byte ptr [ebx+I_SUBUNIT], 0 ;' Drive mov byte ptr [ebx+I_COMMAND], 128 ;' Read_L mov word ptr [ebx+I_STATUS], 0 ;' Status ;--------------------------------------------------------------- mov byte ptr [ebx+I_MEDIA], 0 ;' Mode HSG ;--------------------------------------------------------------- mov eax, BufferTrans ;' Addresse Dest shr eax, 4 ;' Prot->Real mov word ptr [ebx+I_TRANSPTR], 0 mov word ptr [ebx+I_TRANSPTR+2], ax ;--------------------------------------------------------------- mov eax, NbSect ;' Nb Sector mov word ptr [ebx+I_TRANSPTR+4], ax ;--------------------------------------------------------------- mov eax, Start ;' Start Sector mov dword ptr [ebx+I_TRANSPTR+6], eax ;--------------------------------------------------------------- mov byte ptr [ebx+I_TRANSPTR+10], 0 ;' Mode Cooked mov word ptr [ebx+I_TRANSPTR+11], 0 ;' Interl Size+Skip ;--------------------------------------------------------------- mov RMI_EAX, 1510h movzx eax, DriveCDR mov RMI_ECX, eax mov bx, [OffDosCD] mov RMI_ES, bx mov RMI_EBX, 0 mov ax, ds mov es, ax mov edi, offset RMI mov ax, 300h mov bx, 2fh int 31h mov ebx, [PtDosCD] mov ax, word ptr [ebx+I_STATUS] test ax, 8000h jz NoError dec [CptTimeOut] jne Error ret NoError: xor eax, eax ret ReadLongCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetFileCDR proc uses esi edi ebx,\ NameF:DWORD ;-------------------------------------------- mov edi, NameF mov ecx, 0FFh xor al, al repne scasb ;' Size+1 of nameid sub ecx, 0FFh neg ecx mov esi, NameF mov edi, [PtDosCD] rep movsb ;' Copy NameF low mem ;-------------------------------------------- mov RMI_EAX, 150Fh movzx eax, DriveCDR mov ah, 1 ;' mov RMI_ECX, eax movzx ebx, [OffDosCD] mov RMI_ES, bx ;' ES:BX File Name mov RMI_EBX, 0 mov RMI_ESI, ebx ;' Segment mov RMI_EDI, 1024 ;' Offset mov edi, offset RMI mov ax, 300h mov bx, 2fh int 31h ;-------------------------------------------------------- mov eax, RMI_EAX test ax, 8000h jnz Error mov ebx, [PtDosCD] add ebx, 1024 inc ebx mov eax, [ebx] mov [FileCD_Start], eax add ebx, 6 mov eax, [ebx] mov [FileCD_Size], eax add eax, 2048 shr eax, 11 ; (Size+2048)/2048 mov [FileCD_Sect], eax ret Error: xor eax, eax ret GetFileCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ifdef DEBUG ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ OpenCDR proc mov byte ptr LenHDR, 13 mov byte ptr Command, 13 Retry: call TalkCDR_O test ax, 8000h ; Bit 15 jz NoError jmp Retry NoError: ret OpenCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CloseCDR proc mov byte ptr LenHDR, 13 mov byte ptr Command, 14 Retry: call TalkCDR_O test ax, 8000h ; Bit 15 jz NoError jmp Retry NoError: ret CloseCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SeekCDR proc ,\ DebutL:WORD, DebutH:WORD mov byte ptr LenHdr, 24 mov byte ptr Command, 131 mov byte ptr Media, 1 mov ax, DebutL mov word ptr [Starting], ax mov ax, DebutH mov word ptr [Starting+2], ax Retry: call TalkCDR_O test ax, 8000h ; Bit 15 jz NoError jmp Retry NoError: ret SeekCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GetFileCDR proc uses esi edi ebx,\ NameF:DWORD, LowBuffer:DWORD ;-------------------------------------------- mov edi, NameF mov ecx, 0FFh xor al, al repne scasb ;' Size+1 of nameid sub ecx, 0FFh neg ecx mov esi, NameF mov edi, [PtDosCD] rep movsb ;' Copy NameF low mem ;-------------------------------------------- mov RMI_EAX, 150Fh movzx eax, DriveCDR mov ah, 1 ;' mov RMI_ECX, eax mov bx, [OffDosCD] mov RMI_ES, bx ;' ES:BX File Name mov RMI_EBX, 0 mov eax, LowBuffer shr eax, 4 ;' Prot -> Real mov RMI_ESI, eax ;' Segment shr eax, 16 ;' Zero, i know :-[ mov RMI_EDI, eax ;' Offset mov edi, offset RMI mov ax, 300h mov bx, 2fh int 31h ;-------------------------------------------------------- mov eax, RMI_EAX ret GetFileCDR endp ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ endif ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; The End