GSerg писал(а):... который компилировал бы asm-код в то, во что его надо компилировать, и при этом позволял бы получать тело конкретной откомпилированной процедуры в отрыве от всего остального?
; ASM_Magnify.asm by Robert Rayment 7/11/01
; VB
;zParam1 = iXp
;zParam2 = iYp
;MAG = 10*zMag
;
;MAG = 10 * zMag
;Select Case chkMagIndex
;
;Case 0 ' SIMPLE MAG
; MCODE.OpCode = chkMagIndex
; res = CallWindowProc(ptMC, ptrStruc, zParam1, zParam2, MAG)
;Case 1 ' ANTI-ALIAS MAG
; MCODE.OpCode = chkMagIndex
; res = CallWindowProc(ptMC, ptrStruc, zParam1, zParam2, MAG)
;
;End Select
; Assumes MCode Structure set
; MCode Structure
; Public Type MCodeStruc
; PICW As Long
; PICH As Long
; PtrPalBGR As Long
; PtrPalLineCopy As Long
; Increment As Long
; QBLongColor As Long
; OpCode As Long
; End Type
; Public MCODE As MCodeStruc
;
; ptrStruc = VarPtr(MCODE.PICW)
; ptMC = Ptr to mcode byte array
; Magnify
; OpCode& = 0 'Magnify
; OpCode& = 1 'AAMagnify
;
; res = CallWindowProc(ptMC, ptrStruc, zParam1, zParam2, MAG)
; [ebp + 8 12 16 20 ]
%macro movab 2 ; name & num of parameters
push dword %2 ; 2nd param
pop dword %1 ; 1st param
%endmacro ; use movab %1,%2
; Allows eg movab bmW,[ebx+4]
%define PICW [ebp-4] ; PICW Mod 4
%define PICH [ebp-8] ; PICH
%define PtrPalBGR [ebp-12] ; PTR to PalBGR(1,1,1,N)
%define PtrPalLineCopy [ebp-16] ; PTR to PalLineCopy(4,1)
%define Increment [ebp-20] ; 1,2,4,8
%define QBLongColor [ebp-24] ; RGB(QBRed, QBGreen, QBBlue)
%define OpCode [ebp-28] ; 0,1,2,, etc
%define PalSize [ebp-32]
%define LineBytes [ebp-36]
%define Xp [ebp-40] ; from VB
%define Yp [ebp-44] ; from VB
%define ix [ebp-48]
%define iy [ebp-52]
%define culB [ebp-56]
%define culG [ebp-60]
%define culR [ebp-64]
%define zMul [ebp-68]
%define zCos [ebp-72]
%define zSin [ebp-76]
%define Half [ebp-80]
%define numbr [ebp-84]
%define ixs [ebp-88]
%define iys [ebp-92]
%define xs [ebp-96]
%define ys [ebp-100]
%define xsf [ebp-104] ; scale factors
%define ysf [ebp-108]
%define culBT [ebp-112] ; Temps
%define culGT [ebp-116]
%define culRT [ebp-120]
[bits 32]
push ebp
mov ebp,esp
sub esp,120
push edi
push esi
push ebx
; Copy structure
mov ebx,[ebp+8]
movab PICW, [ebx]
movab PICH, [ebx+4]
movab PtrPalBGR, [ebx+8]
movab PtrPalLineCopy,[ebx+12]
movab Increment, [ebx+16]
movab QBLongColor, [ebx+20]
movab OpCode, [ebx+24]
mov eax,[ebp+12]
mov Xp,eax ; rotation point from VB
mov eax,[ebp+16]
mov Yp,eax
mov eax,[ebp+20]
mov zMul,eax
; Make MAG = zMul = 1/zMag (ie 1/ (MAG/10))
mov eax,10
mov numbr,eax
fld1
fild dword zMul
fild dword numbr
fdivp st1 ; zMag, 1
fdivp st1 ; zMul= 1/zMag
fstp dword zMul
mov eax,PICH
mov ebx,PICW
mul ebx
mov PalSize,eax ; In 4 byte chunks
mov eax,PICW
shl eax,4 ; x4
mov LineBytes,eax
; Get RGB
mov eax,QBLongColor
and eax,0FFh
mov culR,eax
mov eax,QBLongColor
and eax,0FF00h
shr eax,8
mov culG,eax
mov eax,QBLongColor
and eax,0FF0000h
shr eax,16
mov culB,eax
; Make Yp PICH-Yp
fild dword PICH
fld dword Yp
fsubp st1 ; PICH-Yp
fstp dword Yp
; Get 0.5 for int round down
mov eax,2
mov Half,eax
fld1
fild dword Half ; 2, 1
fdivp st1 ; 1/2
fstp dword Half
; OpCode& = 0 'Magnify
; OpCode& = 1 'AAMagnify
mov eax,OpCode
cmp eax,0
jne Test1
Call near Magnify
jmp near GETOUT
Test1:
cmp eax,1
jne Test2
Call near AAMagnify
jmp near GETOUT
Test2:
GETOUT:
pop ebx
pop esi
pop edi
mov esp,ebp
pop ebp
ret 16
;############################################################
;============================================================
Magnify: ;0 Magnify(display) 3 into 2
mov edi,PtrPalBGR ; pts to PalBGR(1,1,1,1)
mov eax,PalSize
shl eax,2 ; x4
add edi,eax ; pts to DEST PalBGR(1,1,1,2) Blue
mov esi,PtrPalBGR ; pts to PalBGR(1,1,1,1)
add esi,eax ; pts to PalBGR(1,1,1,2) Blue
add esi,eax ; pts to SOURCE PalBGR(1,1,1,3) Blue
Call SimpleMagnify
RET
;============================================================
AAMagnify: ; 1 Anti-alias Magnify(display) 3 into 2
mov edi,PtrPalBGR ; pts to PalBGR(1,1,1,1)
mov eax,PalSize
shl eax,2 ; x4
add edi,eax ; pts to DEST PalBGR(1,1,1,2) Blue
mov esi,PtrPalBGR ; pts to PalBGR(1,1,1,1)
add esi,eax ; pts to PalBGR(1,1,1,2) Blue
add esi,eax ; pts to SOURCE PalBGR(1,1,1,3) Blue
Call near AAMagnifier
RET
;============================================================
;============================================================
;============================================================
SimpleMagnify: ; 0 & 2
mov eax,PICH
mov ecx,eax
IY0:
mov iy,ecx
push ecx
mov eax,PICW
mov ecx,eax
IX0:
mov ix,ecx
;-----------------------
; Get ixs
fild dword ix
fld dword Xp
fsubp st1 ; (ix-Xp)
fld dword zMul
fmulp st1 ; zMul*(ix-Xp)
fld dword Xp
faddp st1 ; Xp + zMul*(ix-Xp)
fistp dword ixs
; Test if ixs in-range
mov eax,ixs
cmp eax,1
jl QB0
cmp eax,PICW
jle Getiys0
QB0:
;edi->blue in 2
push edi
Call GetAddrEDIixiy
mov eax,culB
mov byte[edi],aL
mov eax,culG
mov byte[edi+1],aL
mov eax,culR
mov byte[edi+2],aL
pop edi
jmp nexix0
Getiys0:
fild dword iy
fld dword Yp
fsubp st1 ; (iy-Yp)
fld dword zMul
fmulp st1 ; zMul*(iy-Yp)
fld dword Yp
faddp st1 ; Yp + zMul*(iy-Yp)
fistp dword iys
; Test if iys in-range
mov eax,iys
cmp eax,1
jl QB00
cmp eax,PICH
jle FillBGR0
QB00:
;edi->blue in 2
push edi
Call GetAddrEDIixiy
mov eax,culB
mov byte[edi],aL
mov eax,culG
mov byte[edi+1],aL
mov eax,culR
mov byte[edi+2],aL
pop edi
jmp nexix0
FillBGR0:
; BGR @ ixs,iys in 3 -> ix,iy in 2
; esi->3 edi->2
push edi
push esi
Call GetAddrESIixsiys ; 3 @ ixs,iys
Call GetAddrEDIixiy ; 2 @ ix,iy
mov aL,byte [esi]
mov byte [edi],aL
mov aL,byte [esi+1]
mov byte [edi+1],aL
mov aL,byte [esi+2]
mov byte [edi+2],aL
pop esi
pop edi
;-----------------------
nexix0:
dec ecx
jnz near IX0
pop ecx
dec ecx
jnz near IY0
RET
;============================================================
AAMagnifier:
mov eax,PICH
mov ecx,eax
IY1:
mov iy,ecx
push ecx
mov eax,PICW
mov ecx,eax
IX1:
mov ix,ecx
;-----------------------
; Get xs
fild dword ix
fld dword Xp
fsubp st1 ; (ix-Xp)
fld dword zMul
fmulp st1 ; zMul*(ix-Xp)
fld dword Xp
faddp st1 ; Xp + zMul*(ix-Xp)
fstp dword xs
; Get ys
fild dword iy
fld dword Yp
fsubp st1 ; (iy-Yp)
fld dword zMul
fmulp st1 ; zMul*(iy-Yp)
fld dword Yp
faddp st1 ; Yp + zMul*(iy-Yp)
fstp dword ys
;-----------------------
; Get ixs,iys INTEGERS
fld dword xs
fld dword Half ; 0.5, xs
fsubp st1 ; xs-0.5
fistp dword ixs ; truncated xs
fld dword ys
fld dword Half ; 0.5, ys
fsubp st1 ; ys-0.5
fistp dword iys ; truncated ys
; Check in-range
mov eax,ixs
cmp eax,1
jl QB1
cmp eax,PICW
jge QB1
mov eax,iys
cmp eax,1
jl QB1
cmp eax,PICH
jge QB1
jmp InRange
QB1:
;edi->blue in 2
push edi
Call GetAddrEDIixiy
mov eax,culB
mov byte[edi],aL
mov eax,culG
mov byte[edi+1],aL
mov eax,culR
mov byte[edi+2],aL
pop edi
jmp near nexix1
;-----------------------
InRange:
; Get scale factors xsf=xs-ixs, ysf=ys-iys
fld dword xs
fild dword ixs
fsubp st1 ; xs-ixs
fstp dword xsf
fld dword ys
fild dword iys
fsubp st1 ; ys-iys
fstp dword ysf
; Pick up from 3 esi
push esi
Call near GetAddrESIixsiys
mov ebx,PICW
shl ebx,2 ; 4*PICW
;===================================
; Get weighted Blue over 4 points
; y, x->x+1
movzx eax,byte[esi] ; B
mov culBT,eax
fild dword culBT
movzx eax,byte[esi+4] ; B+1
mov culBT,eax
fild dword culBT ; P2, P1
fsub st1 ; (P2-P1), P1
fld dword xsf
fmulp st1 ; xsf*(P2-P1), P1
faddp st1 ; PA = P1 + xsf*(P2-P1)
; y+1, x->x+1
movzx eax,byte[esi+ebx] ; B
mov culBT,eax
fild dword culBT
movzx eax,byte[esi+ebx+4] ; B+1
mov culBT,eax
fild dword culBT ; P4, P3
fsub st1 ; (P4-P3), P3
fld dword xsf
fmulp st1 ; xsf*(P4-P3), P3
faddp st1 ; PB= P3 + xsf*(P4-P3), PA
; y->y+1
fsub st1 ; (PB-PA), PA
fld dword ysf
fmulp st1 ; ysf*(PB-PA), PA
faddp st1 ; PA + ysf*(PB-PA)
fistp dword culBT
;===================================
; Get weighted Green over 4 points
inc esi ; GREEN
movzx eax,byte[esi] ; G
mov culGT,eax
fild dword culGT
movzx eax,byte[esi+4] ; G+1
mov culGT,eax
fild dword culGT ; P2, P1
fsub st1 ; (P2-P1), P1
fld dword xsf
fmulp st1 ; xsf*(P2-P1), P1
faddp st1 ; PA = P1 + xsf*(P2-P1)
movzx eax,byte[esi+ebx] ; G
mov culGT,eax
fild dword culGT
movzx eax,byte[esi+ebx+4] ; B+1
mov culGT,eax
fild dword culGT ; P4, P3
fsub st1 ; (P4-P3), P3
fld dword xsf
fmulp st1 ; xsf*(P4-P3), P3
faddp st1 ; PB= P3 + xsf*(P4-P3), PA
fsub st1 ; (PB-PA), PA
fld dword ysf
fmulp st1 ; ysf*(PB-PA), PA
faddp st1 ; PA + ysf*(PB-PA)
fistp dword culGT
;===================================
; Get weighted Red over 4 points
inc esi ; RED
movzx eax,byte[esi] ; R
mov culRT,eax
fild dword culRT
movzx eax,byte[esi+4] ; R+1
mov culRT,eax
fild dword culRT ; P2, P1
fsub st1 ; (P2-P1), P1
fld dword xsf
fmulp st1 ; xsf*(P2-P1), P1
faddp st1 ; PA = P1 + xsf*(P2-P1)
movzx eax,byte[esi+ebx] ; R
mov culRT,eax
fild dword culRT
movzx eax,byte[esi+ebx+4] ; R+1
mov culRT,eax
fild dword culRT ; P4, P3
fsub st1 ; (P4-P3), P3
fld dword xsf
fmulp st1 ; xsf*(P4-P3), P3
faddp st1 ; PB= P3 + xsf*(P4-P3), PA
fsub st1 ; (PB-PA), PA
fld dword ysf
fmulp st1 ; ysf*(PB-PA), PA
faddp st1 ; PA + ysf*(PB-PA)
fistp dword culRT
;===================================
pop esi
; Ensure colors in range
Call near CheckculBGRT
push edi
Call GetAddrEDIixiy
mov eax,culBT
mov byte[edi],aL
mov eax,culGT
mov byte[edi+1],aL
mov eax,culRT
mov byte[edi+2],aL
pop edi
;-----------------------
nexix1:
dec ecx
jnz near IX1
pop ecx
dec ecx
jnz near IY1
RET
;============================================================
;============================================================
CheckculBGRT:
; Ensure colors in range
mov eax,255
cmp culBT,eax ; culBT-255
jle THG
mov culBT,eax
THG:
cmp culGT,eax
jle THR
mov culGT,eax
THR:
cmp culRT,eax
jle LoLim
mov culRT,eax
LoLim:
mov eax,0
cmp culBT,eax ; culBT-0
jge TLG
mov culBT,eax
TLG:
cmp culGT,eax
jge TLR
mov culGT,eax
TLR:
cmp culRT,eax
jge CulsDone
mov culRT,eax
CulsDone:
RET
;============================================================
GetAddrESIixsiys: ; In esi-> PalBGR(1,1,1,2),ix,iy Out: new esi->B
;B = esi + (4 * (iy-1) * PICW + 4 * (ix-1))
;B = esi + 4 * [(iy-1) * PICW + (ix-1))]
mov eax,iys
dec eax
mov ebx,PICW
mul ebx
mov ebx,ixs
dec ebx
add eax,ebx
shl eax,2 ; x4
add esi,eax
RET
;============================================================
GetAddrEDIixiy:
;B = edi + (4 * (iy-1) * PICW + 4 * (ix-1))
;B = edi + 4 * [(iy-1) * PICW + (ix-1))]
mov eax,iy
dec eax
mov ebx,PICW
mul ebx
mov ebx,ix
dec ebx
add eax,ebx
shl eax,2 ; x4
add edi,eax
RET
;============================================================
GetAddrEDIixsiys: ; In edi-> PalBGR(1,1,1,2),ixs,iys Out: new edi->B
;B = edi + (4 * (iy-1) * PICW + 4 * (ix-1))
;B = edi + 4 * [(iy-1) * PICW + (ix-1))]
mov eax,iys
dec eax
mov ebx,PICW
mul ebx
mov ebx,ixs
dec ebx
add eax,ebx
shl eax,2 ; x4
add edi,eax
RET
;============================================================
;============================================================
;mov ebx,[ebp+20]
;mov [ebx],eax
;ret
;jmp GETOUT
;mov eax,ecx
;mov ebx,[ebp+20]
;mov [ebx],eax
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 124