home *** CD-ROM | disk | FTP | other *** search
- ;* ------------------------------------------------------- *
- ;* MYLONG.ASM *
- ;* schnelle Long-Berechnungen auf dem 386 *
- ;* (c) 1992, 1993 Holger Suhr & DMV-Verlag *
- ;* ------------------------------------------------------- *
-
- .MODEL SMALL
-
- ;* ------------------------------------------------------- *
- ;* Die Angabe des Speichermodells ist nicht wichtig, *
- ;* da alle Calls und Procs explizit definiert werden. *
- ;* Daher ist »mylong.obj« mit allen Modellen verwendbar *
- ;* ------------------------------------------------------- *
-
- .DATA
-
- EXTRN __cpu386:WORD
-
- ;* ------------------------------------------------------- *
- ;* externe Variable zur Erkennung eines 386-Prozessors *
- ;* ------------------------------------------------------- *
-
- .CODE
-
- PUBLIC N_LXMUL@, F_LXMUL@
- PUBLIC N_LDIV@ , F_LDIV@
- PUBLIC N_LMOD@ , F_LMOD@
- PUBLIC N_LUDIV@, F_LUDIV@
- PUBLIC N_LUMOD@, F_LUMOD@
- PUBLIC N_LXLSH@, F_LXLSH@
- PUBLIC N_LXRSH@, F_LXRSH@
-
- ;* ------------------------------------------------------- *
- ;* Multiplikation von unsigned long, near call version *
- ;* ------------------------------------------------------- *
-
- N_LXMUL@ PROC NEAR
- TEST __cpu386,1
- JNZ N_LX1
- CALL Near Ptr OLDLXMUL
- RET
- N_LX1:
- CALL Near Ptr LXMUL386
- RET
- N_LXMUL@ ENDP
-
- ;* ------------------------------------------------------- *
- ;* Multiplikation von unsigned long, far call version *
- ;* ------------------------------------------------------- *
-
- F_LXMUL@ PROC FAR
- TEST __cpu386,1
- JNZ F_LX1
- CALL Near Ptr OLDLXMUL
- RETF
- F_LX1:
- CALL Near Ptr LXMUL386
- RETF
- F_LXMUL@ ENDP
-
- ;* ------------------------------------------------------- *
- ;* folgender Code entstammt Borlands Turbo-C 2.0 Library *
- ;* ------------------------------------------------------- *
-
- OLDLXMUL PROC NEAR
- PUSH SI
- XCHG SI, AX
- XCHG DX, AX
- TEST AX, AX
- JE OLXMUL1
- MUL BX
- OLXMUL1:
- XCHG CX, AX
- TEST AX, AX
- JE OLXMUL2
- MUL SI
- ADD CX, AX
- OLXMUL2:
- XCHG SI, AX
- MUL BX
- ADD DX, CX
- POP SI
- RET
- OLDLXMUL ENDP
-
- ;* ------------------------------------------------------- *
- ;* Multiplikation von unsigned long, 386 ist vorhanden *
- ;* ------------------------------------------------------- *
-
- LXMUL386 PROC NEAR
-
- .386
- XCHG DX, AX
- SHL EAX, 16
- MOV AX, DX
- SHL ECX, 16
- MOV CX, BX
-
- MUL ECX
-
- MOV DX, AX
- SHR EAX, 16
- XCHG DX, AX
- RET
- .8086
- LXMUL386 ENDP
-
- ;* ------------------------------------------------------- *
- ;* Division von unsigned long, near call version *
- ;* ------------------------------------------------------- *
-
- N_LUDIV@:
- POP CX
- PUSH CS
- PUSH CX
-
- ;* ------------------------------------------------------- *
- ;* Division von unsigned long, far call version *
- ;* ------------------------------------------------------- *
-
- F_LUDIV@:
- TEST __cpu386,1
- JNZ LUDIV386
-
- MOV CX, 0001
- JMP ENTRYPT
-
- ;* ------------------------------------------------------- *
- ;* Division von unsigned long, 386 ist vorhanden *
- ;* Im Gegensatz zur Multiplikation werden bei der Division *
- ;* die Werte auf dem Stack übergeben *
- ;* ------------------------------------------------------- *
-
- LUDIV386:
-
- .386
- PUSH BP
- MOV BP, SP
-
- MOV EAX, DWord Ptr [BP+6]
-
- CDQ
-
- DIV DWord Ptr [BP+10]
-
- MOV DX, AX
- SHR EAX,16
- XCHG DX, AX
- POP BP
-
- RETF 8
- .8086
-
- ;* ------------------------------------------------------- *
- ;* Division von signed long, near call version *
- ;* ------------------------------------------------------- *
-
- N_LDIV@:
- POP CX
- PUSH CS
- PUSH CX
-
- ;* ------------------------------------------------------- *
- ;* Division von signed long, far call version *
- ;* ------------------------------------------------------- *
-
- F_LDIV@:
- TEST __cpu386,1
- JNZ LDIV386
- XOR CX, CX
- JMP ENTRYPT
-
- ;* ------------------------------------------------------- *
- ;* Division von signed long, 386 ist vorhanden *
- ;* ------------------------------------------------------- *
-
- LDIV386:
-
- .386
- PUSH BP
- MOV BP, SP
-
- MOV EAX, DWord Ptr [BP+6]
- CDQ
-
- IDIV DWord Ptr [BP+10]
- MOV DX, AX
- SHR EAX, 16
- XCHG DX,AX
- POP BP
- RETF 8
- .8086
-
- ;* ------------------------------------------------------- *
- ;* Modulo von unsigned long, near call version *
- ;* ------------------------------------------------------- *
-
- N_LUMOD@:
- POP CX
- PUSH CS
- PUSH CX
-
- ;* ------------------------------------------------------- *
- ;* Modulo von unsigned long, far call version *
- ;* ------------------------------------------------------- *
-
- F_LUMOD@:
- TEST __cpu386,1
- JNZ LUMOD386
- MOV CX,0003
- JMP ENTRYPT
-
- ;* ------------------------------------------------------- *
- ;* Modulo von unsigned long, 386 ist vorhanden *
- ;* ------------------------------------------------------- *
-
- LUMOD386:
-
- .386
- PUSH BP
- MOV BP, SP
-
- MOV EAX, DWord Ptr [BP+6]
- CDQ
- DIV DWord Ptr [BP+10]
-
- MOV AX, DX
- SHR EDX, 16
- POP BP
- RETF 8
- .8086
-
- ;* ------------------------------------------------------- *
- ;* Modulo von signed long, near call version *
- ;* ------------------------------------------------------- *
-
- N_LMOD@:
- POP CX
- PUSH CS
- PUSH CX
-
- ;* ------------------------------------------------------- *
- ;* Modulo von signed long, far call version *
- ;* ------------------------------------------------------- *
-
- F_LMOD@:
- TEST __cpu386,1
- JNZ LMOD386
- MOV CX, 0002
- JMP ENTRYPT
-
- ;* ------------------------------------------------------- *
- ;* Modulo von signed long, 386 ist vorhanden *
- ;* ------------------------------------------------------- *
-
- LMOD386:
-
- .386
- PUSH BP
- MOV BP, SP
-
- MOV EAX, DWord Ptr [BP+6]
- CDQ
-
- IDIV DWord Ptr [BP+10]
-
- MOV AX, DX
- SHR EDX, 16
- POP BP
-
- RETF 8
- .8086
-
- ;* ------------------------------------------------------ *
- ;* leftshift von long, near call version *
- ;* ------------------------------------------------------ *
-
- N_LXLSH@:
- POP BX
- PUSH CS
- PUSH BX
-
- ;* ------------------------------------------------------- *
- ;* leftshift von long, far call version *
- ;* ------------------------------------------------------- *
-
- F_LXLSH@:
- TEST __cpu386,1
- JNZ LSHFT386
-
- ;* ------------------------------------------------------- *
- ;* folgender Code entstammt Borlands Turbo-C 2.0 Library *
- ;* ------------------------------------------------------- *
-
- CMP CL, 16
- JNB LSHFT1
- MOV BX, AX
- SHL AX, CL
- SHL DX, CL
- NEG CL
- ADD CL, 16
- SHR BX, CL
- OR DX, BX
- RETF
-
- LSHFT1:
- SUB CL, 16
- XCHG DX, AX
- XOR AX, AX
- SHL DX, CL
- RETF
-
- ;* ------------------------------------------------------- *
- ;* leftshift von long, 386 vorhanden *
- ;* ------------------------------------------------------- *
-
- LSHFT386:
-
- .386
- XCHG DX, AX
- SHL EAX, 16
- MOV AX, DX
-
- SHL EAX, CL
-
- MOV DX, AX
- SHR EAX, 16
- XCHG DX, AX
- RETF
- .8086
-
- ;* ------------------------------------------------------- *
- ;* rightshift von long, near call version *
- ;* ------------------------------------------------------- *
-
- N_LXRSH@:
- POP BX
- PUSH CS
- PUSH BX
-
- ;* ------------------------------------------------------- *
- ;* rightshift von long, near call version *
- ;* ------------------------------------------------------- *
-
- F_LXRSH@:
- TEST __cpu386,1
- JNZ RSHFT386
-
- ;* ------------------------------------------------------- *
- ;* folgender Code entstammt Borlands Turbo-C 2.0 Library *
- ;* ------------------------------------------------------- *
-
- CMP CL, 16
- JNB RSHFT1
- MOV BX, DX
- SHR AX, CL
- SAR DX, CL
- NEG CL
- ADD CL, 16
- SHL BX, CL
- OR AX, BX
- RETF
-
- RSHFT1:
- SUB CL, 16
- XCHG DX, AX
- CWD
- SAR AX, CL
- RETF
-
- ;* ------------------------------------------------------- *
- ;* rightshift von long, 386 vorhanden *
- ;* ------------------------------------------------------- *
-
- RSHFT386:
-
- .386
- XCHG DX, AX
- SHL EAX, 16
- MOV AX, DX
-
- SHR EAX, CL
-
- MOV DX, AX
- SHR EAX, 16
- XCHG DX, AX
- RETF
- .8086
-
- ;* ------------------------------------------------------- *
- ;* division/modulo von signed und unsigned long ohne 386 *
- ;* ------------------------------------------------------- *
-
- ;* ------------------------------------------------------- *
- ;* folgender Code entstammt Borlands Turbo-C 2.0 Library *
- ;* ------------------------------------------------------- *
-
- ENTRYPT:
- PUSH BP
- PUSH SI
- PUSH DI
- MOV BP, SP
- MOV DI, CX
- MOV AX, [BP+0Ah]
- MOV DX, [BP+0Ch]
- MOV BX, [BP+0Eh]
- MOV CX, [BP+10h]
- OR CX, CX
- JNE DIVMOD1
- OR DX, DX
- JE DIVMOD9
- OR BX, BX
- JE DIVMOD9
- DIVMOD1:
- TEST DI, 0001
- JNE DIVMOD3
- OR DX, DX
- JNS DIVMOD2
- NEG DX
- NEG AX
- SBB DX, 0000
- OR DI, 000Ch
- DIVMOD2:
- OR CX, CX
- JNS DIVMOD3
- NEG CX
- NEG BX
- SBB CX, 0000
- XOR DI, 0004
- DIVMOD3:
- MOV BP, CX
- MOV CX, 0020h
- PUSH DI
- XOR DI, DI
- XOR SI, SI
- DIVMOD4:
- SHL AX, 1
- RCL DX, 1
- RCL SI, 1
- RCL DI, 1
- CMP DI, BP
- JB DIVMOD6
- JA DIVMOD5
- CMP SI, BX
- JB DIVMOD6
- DIVMOD5:
- SUB SI, BX
- SBB DI, BP
- INC AX
- DIVMOD6:
- LOOP DIVMOD4
- POP BX
- TEST BX, 0002
- JE DIVMOD7
- MOV AX, SI
- MOV DX, DI
- SHR BX, 1
- DIVMOD7:
- TEST BX, 0004
- JE DIVMOD8
- NEG DX
- NEG AX
- SBB DX, 0000
- DIVMOD8:
- POP DI
- POP SI
- POP BP
- RETF 8
- DIVMOD9:
- DIV BX
- TEST DI, 0002
- JE DIVMOD10
- MOV AX, DX
- DIVMOD10:
- XOR DX, DX
- JMP DIVMOD8
-
- END
- ;* ------------------------------------------------------- *
- ;* Ende von MYLONG.ASM *
-
-