www.pudn.com > jpeg1.zip > MACROS.ASM


LEN		EQU	8 
EOB  		EQU 	0FFH 
;-------------------------------------- 
DISP_MSG  	MACRO 	MSG 
		PUSH 	AX 
		PUSH 	DX 
		LEA 	DX,MSG 
		MOV 	AH,9 
		INT 	21H 
		POP 	DX 
		POP 	AX 
		ENDM 
;-------------------------------------- 
INS_BSR_BX	MACRO 
		LOCAL	TEST_BX,ZERO,NEXT 
		OR	BX,BX 
		JZ	ZERO 
		MOV	CX,16 
TEST_BX:	DEC	CX 
		SHL	BX,1 
		JNC	TEST_BX 
NEXT:		MOV	BX,CX 
		INC	BX 
ZERO: 
		ENDM 
;-------------------------------------- 
ISHLD		MACRO 
		LOCAL	ZERO,SHIFT 
		OR	CL,CL 
		JZ	SHORT ZERO 
		PUSH	CX 
		XOR	CH,CH 
SHIFT:		SHL	WORD PTR CURRENT_CODE,1 
		RCL	WORD PTR CURRENT_CODE+2,1 
		RCL	BX,1 
		LOOP	SHIFT 
		POP	CX 
ZERO: 
		ENDM 
;-------------------------------------- 
POST		MACRO 
		LOCAL	NEXT 
		CMP	AX,255 
		JNG	NEXT 
		MOV	AX,255 
NEXT: 
		ENDM 
;-------------------------------------- 
CHANGE_FLOAT_INT	MACRO 
		LOCAL	SHIFT,ZERO,IS_1,NEXT,OVER 
		SUB	BH,7EH 
		JS	ZERO 
		JZ	IS_1 
		PUSH	CX 
		MOV	CL,24 
		SUB	CL,BH 
		MOV	BH,BL 
		OR	BL,80H 
SHIFT:		SHR	BL,1 
		RCR	AX,1 
		LOOP	SHIFT 
		ADC	AX,0 
		POP	CX 
NEXT:		TEST	BH,80H 
		JZ	OVER 
		NEG	AX 
		JMP	OVER 
IS_1:  		MOV	AX,1 
		JMP	OVER 
ZERO:		XOR	AX,AX 
OVER: 
		ENDM 
;-------------------------------------- 
CHG_FLOAT_INT	MACRO 
		LOCAL	SHIFT,ZERO,IS_1,NEXT,OVER 
		PUSH	CX 
		PUSH	BX 
		CMP	BH,7EH 
		JB	ZERO 
		JZ	IS_1 
		SUB	BH,7FH 
		OR	BL,80H 
		MOV	CX,23 
		SUB	CL,BH 
SHIFT:		SHR	BL,1 
		RCR	AX,1 
		LOOP	SHIFT 
		ADC	AX,0 
		JMP	NEXT 
ZERO:		XOR	AX,AX 
		JMP	NEXT 
IS_1:   	MOV	AX,1 
NEXT:		POP	BX 
		TEST	BL,80H 
		JZ	OVER 
		NEG	AX 
OVER:   	POP	CX 
		ENDM 
;-------------------------------------- 
ASK_1_X 	MACRO 	K1,K2,I,J,FU 
		MOV 	AL,ES:[SI+BX+7-J] 
		SUB	AL,128 
		CBW 
		MOV 	DX,AX 
		MOV 	AL,ES:[SI+BX+J] 
		SUB	AL,128 
		CBW 
		PUSH	AX 
		ADD 	AX,DX 
		CALL	STANDARD 
		MOV	WORD PTR X1[(K1*8+I)*4+2],AX 
		POP	AX 
		SUB 	AX,DX 
		IF 	FU 
		NEG	AX 
		ENDIF 
		CALL	STANDARD 
		MOV	WORD PTR X1[(K2*8+I)*4+2],AX 
		ADD	BX,STEP 
		ENDM 
;-------------------------------------- 
ASK_X_1 	MACRO	K1,K2,I,J,C,FU 
		MOV	AX,WORD PTR X1[(K1*8+I)*4+2] 
		MOV	BX,WORD PTR X1[(K1*8+I)*4] 
		MOV	CX,WORD PTR X1[(K2*8+I)*4+2] 
		MOV     DX,WORD PTR X1[(K2*8+I)*4] 
		PUSH	AX 
		PUSH	BX 
		PUSH	CX 
		PUSH	DX 
		CALL	FLOAT_ADD 
		MOV	CH,86H 
		XOR	CL,CL 
		XOR	DX,DX 
		CALL	FLOAT_ADD 
		AND	AL,7FH 
		XCHG	AX,BX 
		CHG_FLOAT_INT 
		POST 
		MOV	ES:[SI+BP+7*FU-J*2*FU+J],AL 
		POP	DX 
		POP	CX 
		POP	BX 
		POP	AX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	CH,86H 
		XOR	CL,CL 
		XOR	DX,DX 
		CALL	FLOAT_ADD 
		AND	AL,7FH 
		XCHG	AX,BX 
		CHG_FLOAT_INT 
		POST 
		MOV	ES:[SI+BP+J*2*FU-J-7*FU+7],AL 
		ADD	BP,STEP 
		ENDM 
;-------------------------------------- 
MOV_1_2		MACRO 	NUM1,NUM2,K 
		LOCAL	ZERO 
		MOV	BX,WORD PTR X2[NUM1*4+2] 
		MOV	AX,WORD PTR X2[NUM1*4] 
		IF	K 
		PUSH	BX 
		OR	BX,AX 
		POP	BX 
		JZ      ZERO 
		INC	BH 
ZERO: 
		ENDIF 
		MOV	WORD PTR X1[NUM2*4+2],BX 
		MOV	WORD PTR X1[NUM2*4],AX 
		ENDM 
;-------------------------------------- 
MOV_2_1		MACRO	NUM1,NUM2,K 
		LOCAL	ZERO 
		MOV	BX,WORD PTR X1[NUM1*4+2] 
		MOV	AX,WORD PTR X1[NUM1*4] 
		IF 	K 
		PUSH	BX 
		OR	BX,AX 
		POP	BX 
		JZ      ZERO 
		INC	BH 
ZERO: 
		ENDIF 
		MOV	WORD PTR X2[NUM2*4+2],BX 
		MOV	WORD PTR X2[NUM2*4],AX 
		ENDM 
;-------------------------------------- 
ASK_1_2 	MACRO 	DES_NUM1,DES_NUM2,SOU_NUM1,SOU_NUM2 
		MOV	AX,WORD PTR X2[SOU_NUM1*4+2] 
		MOV	BX,WORD PTR X2[SOU_NUM1*4] 
		MOV	CX,WORD PTR X2[SOU_NUM2*4+2] 
		MOV	DX,WORD PTR X2[SOU_NUM2*4] 
		PUSH	AX 
		PUSH	BX 
		CALL	FLOAT_ADD 
		MOV	WORD PTR X1[DES_NUM1*4+2],AX 
		MOV	WORD PTR X1[DES_NUM1*4],BX 
		POP	BX 
		POP	AX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	WORD PTR X1[DES_NUM2*4+2],AX 
		MOV	WORD PTR X1[DES_NUM2*4],BX 
		ENDM 
;-------------------------------------- 
ASK_2_1		MACRO 	DES_NUM1,DES_NUM2,SOU_NUM1,SOU_NUM2 
		MOV	AX,WORD PTR X1[SOU_NUM1*4+2] 
		MOV	BX,WORD PTR X1[SOU_NUM1*4] 
		MOV	CX,WORD PTR X1[SOU_NUM2*4+2] 
		MOV	DX,WORD PTR X1[SOU_NUM2*4] 
		PUSH	AX 
		PUSH	BX 
		CALL	FLOAT_ADD 
		MOV	WORD PTR X2[DES_NUM1*4+2],AX 
		MOV	WORD PTR X2[DES_NUM1*4],BX 
		POP	BX 
		POP	AX 
		SUB	CL,80H 
		CALL	FLOAT_ADD 
		MOV	WORD PTR X2[DES_NUM2*4+2],AX 
		MOV	WORD PTR X2[DES_NUM2*4],BX 
		ENDM 
;-------------------------------------- 
DIVIDE		MACRO	LOC,INT 
		LOCAL	OVERFLOW,DIV_END 
		MOV	AX,[SI+LOC*4+2] 
		SUB	AH,INT/2 
		JNC	DIV_END 
OVERFLOW:	XOR	AX,AX 
		MOV	[SI+LOC*4],AX 
DIV_END:        MOV	[SI+LOC*4+2],AX 
		ENDM 
;-------------------------------------- 
DIV32		MACRO	LOC,INT 
		LOCAL	OVERFLOW,DIV_END 
		MOV	AX,[SI+LOC*4+2] 
		SUB	AH,INT/32+4 
		JNC	DIV_END 
OVERFLOW:	XOR	AX,AX 
		MOV	[SI+LOC*4],AX 
DIV_END:	MOV	[SI+LOC*4+2],AX 
		ENDM 
;-------------------------------------- 
MOVS_1_2	MACRO 	NUM1,NUM2,K 
		LOCAL   DIVE,OVER 
		MOV	AX,WORD PTR X2[NUM1*4+2] 
		MOV	BX,WORD PTR X2[NUM1*4] 
		IF	K 
		MOV	WORD PTR X1[NUM2*4],BX 
		MOV	WORD PTR X1[NUM2*4+2],AX 
		LEA	BP,CONST7 
		LEA	DI,X1[NUM2*4] 
		CALL	FLOAT_DIV 
		ELSE 
		SUB	AH,2 
		JNC     DIVE 
		XOR	AX,AX 
		MOV     WORD PTR X1[NUM2*4],AX 
		MOV	WORD PTR X1[NUM2*4+2],AX 
		JMP	SHORT OVER 
DIVE:		MOV	WORD PTR X1[NUM2*4],BX 
		MOV	WORD PTR X1[NUM2*4+2],AX 
OVER: 
		ENDIF 
		ENDM 
;-------------------------------------- 
MOVS_2_1	MACRO 	NUM1,NUM2,K 
		LOCAL	ZERO 
		MOV	AX,WORD PTR X1[NUM1*4+2] 
		MOV	BX,WORD PTR X1[NUM1*4] 
		IF	K 
		MOV	WORD PTR X2[NUM2*4],BX 
		MOV	WORD PTR X2[NUM2*4+2],AX 
		LEA	DI,X2[NUM2*4] 
		LEA	BP,CONST7 
		CALL	FLOAT_MUL 
		ELSE 
		PUSH	AX 
		OR	AX,BX 
		POP	AX 
		JZ	ZERO 
		ADD	AH,2 
ZERO:   	MOV	WORD PTR X2[NUM2*4+2],AX 
		MOV	WORD PTR X2[NUM2*4],BX 
		ENDIF 
		ENDM 
;-------------------------------------- 
MOV_1_2_87	MACRO 	NUM1,NUM2,K 
		FLD  	X2[NUM1*4] 
		IF 	K 
		FIMUL 	INT_2 
		ENDIF 
		FSTP 	X1[NUM2*4] 
		FWAIT 
		ENDM 
;-------------------------------------- 
MOV_2_1_87	MACRO 	NUM1,NUM2,K 
		FLD 	X1[NUM1*4] 
		IF 	K 
		FIMUL 	INT_2 
		ENDIF 
		FSTP 	X2[NUM2*4] 
		FWAIT 
		ENDM 
;-------------------------------------- 
ASK_1_2_87 	MACRO 	DES_NUM1,DES_NUM2,SOU_NUM1,SOU_NUM2 
		FLD 	X2[SOU_NUM1*4] 
		FADD 	X2[SOU_NUM2*4] 
		FSTP 	X1[DES_NUM1*4] 
		FLD 	X2[SOU_NUM1*4] 
		FSUB 	X2[SOU_NUM2*4] 
		FSTP 	X1[DES_NUM2*4] 
		FWAIT 
		ENDM 
;-------------------------------------- 
ASK_2_1_87	MACRO 	DES_NUM1,DES_NUM2,SOU_NUM1,SOU_NUM2 
		FLD 	X1[SOU_NUM1*4] 
		FADD  	X1[SOU_NUM2*4] 
		FSTP 	X2[DES_NUM1*4] 
		FLD 	X1[SOU_NUM1*4] 
		FSUB 	X1[SOU_NUM2*4] 
		FSTP 	X2[DES_NUM2*4] 
		FWAIT 
		ENDM 
;-------------------------------------- 
MOVS_1_2_87	MACRO 	NUM1,NUM2,K 
		IF 	K 
		FLD 	X2[NUM1*4] 
		FDIV 	CONST77 
		ELSE 
		FLD 	X2[NUM1*4] 
		FIDIV 	INT_4 
		ENDIF 
		FSTP 	X1[NUM2*4] 
		FWAIT 
		ENDM 
;-------------------------------------- 
MOVS_2_1_87	MACRO 	NUM1,NUM2,K 
		IF 	K 
		FLD 	X1[NUM1*4] 
		FMUL 	CONST77 
		ELSE 
		FLD 	X1[NUM1*4] 
		FIMUL 	INT_4 
		ENDIF 
		FSTP 	X2[NUM2*4] 
		FWAIT 
		ENDM 
;-------------------------------------- 
D_SHIFT 	MACRO 
		LOCAL 	GREATER,LESS,EQUAL,NEXT 
		PUSH	CX 
		CMP 	DH,DL 
		JB 	LESS 
		JE 	EQUAL 
GREATER:	MOV 	CL,DL 
		CALL	SHIFT_IN 
		SUB 	DH,DL 
		JMP 	SHORT NEXT 
EQUAL:  	MOV 	CL,DL 
		CALL	SHIFT_IN 
		INC 	BP 
		MOV 	DH,32 
		JMP 	SHORT NEXT 
LESS:   	MOV 	CL,DH 
		CALL	SHIFT_IN 
		INC 	BP 
		SUB 	DL,DH 
		MOV 	CL,DL 
		CALL	SHIFT_IN 
		MOV 	DH,32 
		SUB 	DH,DL 
NEXT:   	POP	CX 
		ENDM 
;-------------------------------------- 
INDEX_8 	MACRO 
		LOCAL 	GREAT_EQUAL,LESS,NEXT 
		MOV	DL,8 
		XOR	BX,BX 
		CMP	DH,DL 
		JB	LESS 
GREAT_EQUAL:	MOV	BL,BYTE PTR CURRENT_CODE+3 
		JMP	NEXT 
LESS:   	PUSH	BP 
		PUSH	DI 
		MOV	DI,BP 
		INC	DI 
		SHL	DI,1 
		SHL	DI,1 
		MOV	AH,ES:[DI+3] 
		POP	DI 
		POP	BP 
		MOV	BL,BYTE PTR CURRENT_CODE+3 
		MOV	CL,8 
		SUB	CL,DH 
		SHR	BL,CL 
		SHL	BL,CL 
		MOV	CL,DH 
		SHR	AH,CL 
		OR	BL,AH 
NEXT: 
		ENDM 
;-------------------------------------- 
INDEX_16	MACRO 
		LOCAL GREAT2_EQUAL2,LESS,NEXT 
		MOV	DL,16 
		XOR	BX,BX 
		CMP	DH,DL 
		JB	LESS 
GREAT2_EQUAL2:	MOV	BX,WORD PTR CURRENT_CODE+2 
		JMP	NEXT 
LESS: 
		PUSH	BP 
		PUSH	DI 
		MOV	DI,BP 
		INC	DI 
		SHL	DI,1 
		SHL	DI,1 
		MOV	AX,ES:[DI+2] 
		POP	DI 
		POP	BP 
		MOV	BX,WORD PTR CURRENT_CODE+2 
		MOV	CL,16 
		SUB	CL,DH 
		SHR	BX,CL 
		SHL	BX,CL 
		MOV	CL,DH 
		SHR	AX,CL 
		OR	BX,AX 
NEXT: 
		ENDM 
;-------------------------------------- 
I_SHIFT 	MACRO 
		LOCAL GREATER,LESS,EQUAL,NEXT 
		XOR	BX,BX 
		CMP	DH,DL 
		JB	LESS 
		JE	EQUAL 
GREATER:	MOV	CL,DL 
		ISHLD 
		SUB	DH,DL 
		JMP	NEXT 
EQUAL:  	MOV	CL,DL 
		ISHLD 
		INC	BP 
		SHL	BP,1 
		SHL	BP,1 
		MOV	AX,ES:[BP+2] 
		MOV	WORD PTR CURRENT_CODE+2,AX 
		MOV	AX,ES:[BP] 
		MOV	WORD PTR CURRENT_CODE,AX 
		SHR	BP,1 
		SHR	BP,1 
		MOV	DH,32 
		JMP	NEXT 
LESS:   	MOV	CL,DH 
		ISHLD 
		SUB	DL,DH 
		MOV	CL,DL 
		INC	BP 
		SHL	BP,1 
		SHL	BP,1 
		MOV	AX,ES:[BP+2] 
		MOV	WORD PTR CURRENT_CODE+2,AX 
		MOV	AX,ES:[BP] 
		MOV	WORD PTR CURRENT_CODE,AX 
		SHR	BP,1 
		SHR	BP,1 
		ISHLD 
		MOV	DH,32 
		SUB	DH,DL 
NEXT: 
		ENDM