494 lines
7.5 KiB
PHP
494 lines
7.5 KiB
PHP
;--------------------;
|
||
; MACROS.INC ;
|
||
;--------------------;
|
||
|
||
macro __mov reg,a { ; mike.dld
|
||
if ~a eq
|
||
mov reg,a
|
||
end if
|
||
}
|
||
|
||
macro mcall a,b,c,d,e,f { ; mike.dld
|
||
__mov eax,a
|
||
__mov ebx,b
|
||
__mov ecx,c
|
||
__mov edx,d
|
||
__mov esi,e
|
||
__mov edi,f
|
||
int 0x40
|
||
}
|
||
|
||
;--------------------;
|
||
; ASCL.INC ;
|
||
;--------------------;
|
||
|
||
macro words2reg reg,hiword,lowword
|
||
{
|
||
if hiword eq
|
||
if lowword eq
|
||
; not changes
|
||
else
|
||
if lowword eqtype 12
|
||
and reg,dword 0xffff0000
|
||
add reg,dword lowword
|
||
else
|
||
and reg,dword 0xffff0000
|
||
add reg,dword lowword
|
||
end if
|
||
end if
|
||
else
|
||
if lowword eq
|
||
if hiword eqtype 12
|
||
and reg,dword 0x0000ffff
|
||
add reg,dword hiword*65536
|
||
else
|
||
shl reg,16
|
||
add reg,dword hiword
|
||
ror reg,16
|
||
end if
|
||
else
|
||
if lowword eqtype 12 & hiword eqtype 12
|
||
if lowword eq 0 & hiword eq 0
|
||
xor reg,reg
|
||
else
|
||
mov reg,dword hiword*65536+lowword
|
||
end if
|
||
else
|
||
mov reg,dword hiword
|
||
shl reg,16
|
||
add reg,dword lowword
|
||
end if
|
||
end if
|
||
end if
|
||
}
|
||
|
||
;--------------------;
|
||
; MOSUZIT.INC ;
|
||
;--------------------;
|
||
|
||
;WriteTextToWindow
|
||
macro Text xStart,yStart,rgbColor,pText,nTextLen
|
||
{
|
||
words2reg ebx, xStart, yStart
|
||
mov ecx, rgbColor
|
||
mov edx, pText
|
||
mov esi, nTextLen
|
||
mov eax, 4
|
||
int 0x40
|
||
}
|
||
|
||
;DisplayNumber
|
||
macro Number xStart,yStart,nPrintType,noOfDigits,Data,rgbColor
|
||
{
|
||
words2reg edx,xStart,yStart
|
||
words2reg ebx,noOfDigits,nPrintType
|
||
mov ecx,Data
|
||
mov esi,rgbColor
|
||
mov eax,47
|
||
int 0x40
|
||
}
|
||
|
||
macro DrawLine xStart,xEnd,yStart,yEnd,rgbColor
|
||
{
|
||
words2reg ebx,xStart,xEnd
|
||
words2reg ecx,yStart,yEnd
|
||
mov edx,rgbColor
|
||
mov eax,38
|
||
int 0x40
|
||
}
|
||
;********************************************************
|
||
macro Extracteax temp,fromBit,bitCount,dest
|
||
{
|
||
mov temp, eax
|
||
shr temp, fromBit
|
||
and temp, (1 shl bitCount - 1)
|
||
mov dest, temp
|
||
}
|
||
;********************************************************
|
||
;********* AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM *********
|
||
;********************************************************
|
||
extract_bits: ;11xA is sync
|
||
;Defined as the following:
|
||
; b1s ; standard
|
||
; b1l ; layer
|
||
; crc ; CRC protection
|
||
|
||
; Bita ; Bitrate
|
||
; sam ; Sampling rate
|
||
; pad ; Padding
|
||
; priv ; Private bit
|
||
|
||
; shan ; Channel mode
|
||
; modx ; Mode extention
|
||
; copy ; Copyright
|
||
; orig ; Original
|
||
; emph ; Emphasis
|
||
|
||
;--------------------- Standard (BB)
|
||
Extracteax ebx, 11, 2, [b1s]
|
||
;--------------------- Layer (CC)
|
||
Extracteax ebx, 9, 2, [b1l]
|
||
;--------------------- CRC (D)
|
||
Extracteax ebx, 8, 1, [crc]
|
||
;--------------------- Bitrate (EEEE)
|
||
Extracteax ebx, 20, 4, [Bita]
|
||
;--------------------- Sample Rate (FF)
|
||
Extracteax ebx, 18, 2, [sam]
|
||
;--------------------- padding (G)
|
||
Extracteax ebx, 17, 1, [pad]
|
||
;--------------------- Private bit (H)
|
||
Extracteax ebx, 16, 1, [priv]
|
||
;--------------------- Channels (II)
|
||
Extracteax ebx, 30, 2, [shan]
|
||
;--------------------- Mode ext (JJ)
|
||
Extracteax ebx, 28, 2, [modx]
|
||
;--------------------- Copyright (K)
|
||
Extracteax ebx, 27, 1, [copy]
|
||
;--------------------- Original (L)
|
||
Extracteax ebx, 26, 1, [orig]
|
||
;--------------------- Emphasis (MM)
|
||
Extracteax ebx, 24, 2, [emph]
|
||
|
||
ret
|
||
;********************************************************
|
||
decode_standard:
|
||
|
||
comp0:
|
||
cmp [b1s], 00b
|
||
je S25
|
||
|
||
comp1:
|
||
cmp [b1s], 01b ; unknown
|
||
je S25
|
||
|
||
comp2:
|
||
cmp [b1s], 10b
|
||
je S20
|
||
|
||
comp3:
|
||
cmp [b1s], 11b
|
||
je S10
|
||
|
||
jmp S000
|
||
|
||
;-----
|
||
|
||
S25:
|
||
mov [S1], 2
|
||
mov [S2], 5
|
||
mov [id], 3 ;lowest freq
|
||
jmp S000
|
||
|
||
S20:
|
||
mov [S1], 2
|
||
mov [S2], 0
|
||
mov [id], 2 ;low freq
|
||
jmp S000
|
||
|
||
S10:
|
||
mov [S1], 1
|
||
mov [S2], 0
|
||
mov [id], 1 ;hi freq
|
||
jmp S000
|
||
|
||
S000:
|
||
|
||
ret
|
||
|
||
;********************************************************
|
||
|
||
decode_layer:
|
||
|
||
com0:
|
||
cmp [b1l], 00b
|
||
je L3 ; unknown
|
||
|
||
com1:
|
||
cmp [b1l], 01b
|
||
je L3
|
||
|
||
com2:
|
||
cmp [b1l], 10b
|
||
je L2
|
||
|
||
com3:
|
||
cmp [b1l], 11b
|
||
je L1
|
||
|
||
jmp L000
|
||
|
||
;-----
|
||
|
||
L3:
|
||
mov [La], 3
|
||
jmp L000
|
||
|
||
L2:
|
||
mov [La], 2
|
||
jmp L000
|
||
|
||
L1:
|
||
mov [La], 1
|
||
jmp L000
|
||
|
||
L000:
|
||
|
||
ret
|
||
|
||
;********************************************************
|
||
|
||
decode_channels:
|
||
|
||
co0:
|
||
cmp [shan], 00b
|
||
je C4
|
||
|
||
co1:
|
||
cmp [shan], 01b
|
||
je C3
|
||
|
||
co2:
|
||
cmp [shan], 10b
|
||
je C2
|
||
|
||
co3:
|
||
cmp [shan], 11b
|
||
je C1
|
||
|
||
jmp C000
|
||
|
||
;-----
|
||
C4:
|
||
mov [K], 4 ;00=Stereo
|
||
jmp C000
|
||
|
||
C3:
|
||
mov [K], 3 ;01=Joint stereo
|
||
jmp C000
|
||
|
||
C2:
|
||
mov [K], 2 ;10=Dual Channel
|
||
jmp C000
|
||
|
||
C1:
|
||
mov [K], 1 ;11=Single Channel (Mono)
|
||
jmp C000
|
||
|
||
C000:
|
||
|
||
ret
|
||
;********************************************************
|
||
;--------------------------
|
||
; decode_samplerate
|
||
;--------------------------
|
||
decode_samplerate:
|
||
push eax
|
||
push ecx
|
||
|
||
mov eax, [sam]
|
||
mov eax, [freq + eax*4]
|
||
mov ecx, [b1s]
|
||
cmp cl, 01 ; bad frequency
|
||
jnz ok
|
||
|
||
ok:
|
||
cmp cl, 0
|
||
jz @f
|
||
dec cl
|
||
@@:
|
||
shl eax, cl
|
||
mov [SR], eax
|
||
|
||
pop ecx
|
||
pop eax
|
||
ret
|
||
|
||
;********************************************************
|
||
;--------------------------
|
||
; decode_bitrate
|
||
;--------------------------
|
||
decode_bitrate:
|
||
push eax
|
||
push ebx
|
||
mov eax,[b1s]
|
||
and eax,1
|
||
shl eax,4
|
||
lea eax,[eax*3]
|
||
mov ebx,[b1l]
|
||
dec ebx
|
||
shl ebx, 4
|
||
add eax, ebx
|
||
add eax,[Bita]
|
||
movzx eax,byte[Bitrate+eax]
|
||
shl eax,3
|
||
mov [BR],eax
|
||
pop ebx
|
||
pop eax
|
||
ret
|
||
|
||
;********************************************************
|
||
|
||
calculate_time_frame_count:
|
||
|
||
;----------------------------duration
|
||
xor eax, eax
|
||
xor ebx, ebx
|
||
xor ecx, ecx
|
||
xor edx, edx
|
||
|
||
mov ebx, dword[BR]
|
||
imul ebx, 125
|
||
; result in ebx
|
||
|
||
|
||
mov eax, dword[size]
|
||
|
||
div ebx
|
||
|
||
|
||
mov dword[time], eax
|
||
;---------------------------frame size
|
||
|
||
xor eax, eax
|
||
xor ebx, ebx
|
||
xor ecx, ecx
|
||
xor edx, edx
|
||
|
||
cmp [S1], 1
|
||
je MP1
|
||
cmp [S1], 2
|
||
je MP2
|
||
|
||
MP1:
|
||
|
||
mov eax, dword [BR]
|
||
imul eax, 144000
|
||
; result in eax
|
||
|
||
|
||
mov ebx, dword[SR]
|
||
|
||
div ebx
|
||
|
||
add eax, dword [pad]
|
||
|
||
mov dword[frames], eax
|
||
|
||
jmp exx
|
||
|
||
MP2:
|
||
|
||
mov eax, dword [BR]
|
||
imul eax, 72000
|
||
; result in eax
|
||
|
||
|
||
mov ebx, dword[SR]
|
||
|
||
div ebx
|
||
|
||
add eax, dword [pad]
|
||
|
||
mov dword[frames], eax
|
||
|
||
exx:
|
||
;--------------------------quantity of frames
|
||
xor eax, eax
|
||
xor ebx, ebx
|
||
xor ecx, ecx
|
||
xor edx, edx
|
||
|
||
mov eax, dword[size]
|
||
mov ebx, dword[frames]
|
||
div ebx
|
||
mov dword[framecount], eax
|
||
|
||
ret
|
||
|
||
;--------------------------
|
||
; header_check
|
||
; eax = <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;--------------------------
|
||
Header_Check:
|
||
|
||
push ebx
|
||
mov ebx, eax
|
||
|
||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 11 <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
and eax, 0E0FFh
|
||
cmp eax, 0E0FFh
|
||
jnz bad
|
||
|
||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MPEG
|
||
mov eax, ebx
|
||
and eax, 1800h
|
||
cmp eax, 0800h
|
||
jz bad
|
||
|
||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> layer
|
||
mov eax, ebx
|
||
test eax, 0600h
|
||
jz bad
|
||
|
||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
mov eax, ebx
|
||
and eax, 0F00000h
|
||
cmp eax, 0F00000h
|
||
jz bad
|
||
test eax, eax
|
||
jz bad
|
||
|
||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
mov eax, ebx
|
||
and eax, 0C0000h
|
||
cmp eax, 0C0000h
|
||
jz bad
|
||
.end_test:
|
||
xor eax, eax
|
||
pop ebx
|
||
ret
|
||
|
||
bad:
|
||
mov eax, 1
|
||
pop ebx
|
||
ret
|
||
|
||
|
||
;===========================
|
||
Win2Dos:
|
||
;===========================
|
||
jcxz .no_chars
|
||
push esi
|
||
push edi
|
||
push ecx
|
||
mov edi, esi
|
||
cld
|
||
.next_char:
|
||
lodsb
|
||
cmp al, 0xC0
|
||
jae .rus
|
||
cmp al, 0xA8
|
||
jnz @f
|
||
mov al, 0xF0
|
||
@@:
|
||
cmp al, 0xB8
|
||
jnz @f
|
||
mov al, 0xF1
|
||
@@:
|
||
jmp .char_ready
|
||
.rus:
|
||
cmp al, 0xF0
|
||
jae @f
|
||
sub al, 48
|
||
@@:
|
||
sub al, 16
|
||
.char_ready:
|
||
stosb
|
||
dec ecx
|
||
jnz .next_char
|
||
|
||
pop ecx
|
||
pop edi
|
||
pop esi
|
||
.no_chars:
|
||
ret |