0,0 → 1,494 |
;--------------------; |
; 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 = ïðîâåðÿåìûé çàãîëîâîê |
;-------------------------- |
Header_Check: |
|
push ebx |
mov ebx, eax |
|
; Ïðîâåðÿåì 11 áèò â íà÷àëå ôðåéìà |
and eax, 0E0FFh |
cmp eax, 0E0FFh |
jnz bad |
|
; Ïðîâåðÿåì âåðñèþ MPEG |
mov eax, ebx |
and eax, 1800h |
cmp eax, 0800h |
jz bad |
|
; Ïðîâåðÿåì layer |
mov eax, ebx |
test eax, 0600h |
jz bad |
|
; Ïðîâåðÿåì áèòðåéò |
mov eax, ebx |
and eax, 0F00000h |
cmp eax, 0F00000h |
jz bad |
test eax, eax |
jz bad |
|
; Ïðîâåðÿåì ÷àñòîòó |
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 |