mahlendur/_work/Data/Scripts/Content/LeGo_NewVer/Int64.d
Daniel Heße 892a40ff0f Initial commit with Subversion-codebase from 13/05/2022.
Cleaned up the mess, at this time, only viable data get synced (_work directory for Gothic-data, miranda for mdc-scripts.
Need to symlink files to a working directory.
2022-05-13 17:38:52 +02:00

304 lines
No EOL
10 KiB
D

/***********************************\
Int64
\***********************************/
class int64 { // Just if someone wants to use this... It's not really necessary.
var int lo;
var int hi;
};
instance int64@(int64) {
lo = -1060454374;
hi = -1378545154;
};
func void mk64(var int dest, var int lo, var int hi) { // Make Int64 // hi has to be -1 for negative 32bit lo
MEM_WriteInt(dest, lo);
MEM_WriteInt(dest+4, hi);
};
const int neg64_asm = 0;
func void neg64(var int dest /*dest<- -dest*/) {
var int dest0; var int dest4;
dest0 = MEM_ReadInt(dest); dest4 = MEM_ReadInt(dest+4);
if (!neg64_asm) {
/* push eax 50
mov eax, [dest] A1 ?? ?? ?? ??
neg eax F7 D8
mov [dest], eax A3 ?? ?? ?? ??
mov eax, [dest+4] A1 ?? ?? ?? ??
adc eax, 0 83 D1 00
neg eax F7 D8
mov [dest+4], eax A3 ?? ?? ?? ??
pop eax 58
*/
ASM_1(80);
ASM_1(161); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(247); ASM_1(216);
ASM_1(163); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(161); ASM_4(MEM_GetIntAddress(dest4));
ASM_1(131); ASM_1(209); ASM_1(0);
ASM_1(247); ASM_1(216);
ASM_1(163); ASM_4(MEM_GetIntAddress(dest4));
ASM_1(88);
neg64_asm = ASM_Close();
};
ASM_Run(neg64_asm);
MEM_WriteInt(dest, dest0);
MEM_WriteInt(dest+4, dest4);
};
const int add64_asm = 0;
func void add64(var int dest, var int src/*dest<-dest+src*/) {
var int dest0; var int dest4; var int src0; var int src4;
dest0 = MEM_ReadInt(dest); dest4 = MEM_ReadInt(dest+4);
src0 = MEM_ReadInt(src); src4 = MEM_ReadInt(src+4);
if (!add64_asm) {
/* Assembly code - Look up Opcodes?
push eax 50
push edx 52
mov eax, [dest] A1 ?? ?? ?? ??
mov edx, [dest+4] 8B 15 ?? ?? ?? ??
add eax, [src] 03 05 ?? ?? ?? ?? // This comes out to 38 Byte
adc edx, [src+4] 13 15 ?? ?? ?? ??
mov dest, eax A3 ?? ?? ?? ??
mov dest+4, edx 89 15 ?? ?? ?? ??
pop edx 5A
pop eax 58
*/
ASM_Open(50);
ASM_1(80);
ASM_1(82);
ASM_1(161); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(139); ASM_1(21); ASM_4(MEM_GetIntAddress(dest4));
ASM_1(3); ASM_1(5); ASM_4(MEM_GetIntAddress(src0));
ASM_1(19); ASM_1(21); ASM_4(MEM_GetIntAddress(src4));
ASM_1(163); ASM_4(dest);
ASM_1(137); ASM_1(21); ASM_4(dest+4);
ASM_1(90);
ASM_1(88);
add64_asm = ASM_Close();
};
ASM_Run(add64_asm);
MEM_WriteInt(dest, dest0);
MEM_WriteInt(dest+4, dest4);
};
const int sub64_asm = 0;
func void sub64(var int dest, var int src/*dest<-dest-src*/) {
var int dest0; var int dest4; var int src0; var int src4;
dest0 = MEM_ReadInt(dest); dest4 = MEM_ReadInt(dest+4);
src0 = MEM_ReadInt(src); src4 = MEM_ReadInt(src+4);
if (!sub64_asm) {
/* Assembly Code - Look up opcodes
push eax 50
push edx 52
mov eax, [dest] A1 ?? ?? ?? ??
mov edx, [dest+4] 8B 15 ?? ?? ?? ??
sub eax, [src] 2B 05 ?? ?? ?? ?? // This comes out to 38 Byte
sbb edx, [src+4] 1B 15 ?? ?? ?? ??
mov dest+4, eax A3 ?? ?? ?? ??
mov dest, edx 89 15 ?? ?? ?? ??
pop edx 5A
pop eax 58
*/
ASM_Open(50);
ASM_1(80);
ASM_1(82);
ASM_1(161); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(139); ASM_1(21); ASM_4(MEM_GetIntAddress(dest4));
ASM_1(43); ASM_1(5); ASM_4(MEM_GetIntAddress(src0));
ASM_1(27); ASM_1(21); ASM_4(MEM_GetIntAddress(src4));
ASM_1(163); ASM_4(MEM_GetIntAddress(dest4));
ASM_1(137); ASM_1(21); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(90);
ASM_1(88);
sub64_asm = ASM_Close();
};
ASM_Run(sub64_asm);
MEM_WriteInt(dest, dest0);
MEM_WriteInt(dest+4, dest4);
};
// Everything below is certainly not working!
// ToDo:
// Make the ASM dynamic so I don't have to recreate it every time.
// Care for the sign of the numbers (using neg64()).
const int mul64_asm = 0;
func void mul64(var int dest, var int src /*dest<-dest*src*/) {
var int dest0; var int dest4; var int src0; var int src4;
dest0 = MEM_ReadInt(dest); dest4 = MEM_ReadInt(dest+4);
src0 = MEM_ReadInt(src); src4 = MEM_ReadInt(src+4);
var int sign; sign = 1; /*positive*/ if (dest4 < 0) { sign = -sign; neg64(dest); }; // It's okay to change the original value because it gets overridden anyway.
var int ptr; ptr = 0;
if (src4 < 0) {
sign = -sign;
ptr = MEM_Alloc(8); MEM_CopyWords(src, ptr, 2);
src = ptr; // I can't change the original value!
neg64(src);
};
dest0 = MEM_ReadInt(dest); dest4 = MEM_ReadInt(dest+4);
src0 = MEM_ReadInt(src); src4 = MEM_ReadInt(src+4); // Init it again because signs might have changed.
if (!mul64_asm) {
/* Assembler Code - Look up Opcodes? HI first
mov eax, [dest+4] A1 ?? ?? ?? ??
push eax 50
mov eax, [dest] A1 ?? ?? ?? ??
push eax 50
mov eax, [src+4] A1 ?? ?? ?? ??
push eax 50
mov eax, [src] A1 ?? ?? ?? ??
push eax 50
call __allmul E8 ?? ?? ?? ??
mov dest, eax A3 ?? ?? ?? ??
mov dest+4, edx 89 15 ?? ?? ?? ??
I hope - since it says allmul - I don't have to care about signed/unsigned, but I'm not quite sure. */
ASM_Open(200);
// ASM_1(96);
ASM_1(161); ASM_4(MEM_GetIntAddress(dest4)); //4040 - 0440 - 0404 - 4004
ASM_1(80);
ASM_1(161); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(80);
ASM_1(161); ASM_4(MEM_GetIntAddress(src4));
ASM_1(80);
ASM_1(161); ASM_4(MEM_GetIntAddress(src0));
ASM_1(80);
ASM_1(232); ASM_4(8221184-ASM_Here()-4);
ASM_1(163); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(137); ASM_1(21); ASM_4(MEM_GetIntAddress(dest4));
//ASM_1(97);
//
mul64_asm = ASM_Close();
};
ASM_Run(mul64_asm);
MEM_WriteInt(dest, dest0);
MEM_WriteInt(dest+4, dest4);
if (sign == -1) { neg64(dest); };
if (ptr) { MEM_Free(ptr); };
};
const int div64_asm = 0;
func void div64(var int dest, var int src /*dest<- dest/src*/) {
var int dest0; var int dest4; var int src0; var int src4;
/* for no reason dest and src are swapped, this might make the code somewhat harder to understand, though*/
dest0 = MEM_ReadInt(src); dest4 = MEM_ReadInt(src+4);
src0 = MEM_ReadInt(dest); src4 = MEM_ReadInt(dest+4);
var int sign; sign = 1; /*positive*/ if (dest4 < 0) { sign = -sign; neg64(dest); }; // It's okay to change the original value because it gets overridden anyway.
var int ptr; ptr = 0;
if (src4 < 0) {
sign = -sign;
ptr = MEM_Alloc(8); MEM_CopyWords(src, ptr, 2);
src = ptr; // I can't change the original value!
neg64(src);
};
dest0 = MEM_ReadInt(src); dest4 = MEM_ReadInt(src+4);
src0 = MEM_ReadInt(dest); src4 = MEM_ReadInt(dest+4); // Init it again because signs might have changed.
if (!div64_asm) {
/* Assembler Code - Look up Opcodes? HI first
mov eax, [dest+4] A1 ?? ?? ?? ??
push eax 50
mov eax, [dest] A1 ?? ?? ?? ??
push eax 50
mov eax, [src+4] A1 ?? ?? ?? ??
push eax 50
mov eax, [src] A1 ?? ?? ?? ??
push eax 50
call __allmul E8 ?? ?? ?? ??
mov dest, eax A3 ?? ?? ?? ??
mov dest+4, edx 89 15 ?? ?? ?? ??
I hope - since it says allmul - I don't have to care about signed/unsigned, but I'm not quite sure. */
ASM_Open(200);
ASM_1(161); ASM_4(MEM_GetIntAddress(dest4));
ASM_1(80);
ASM_1(161); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(80);
ASM_1(161); ASM_4(MEM_GetIntAddress(src4));
ASM_1(80);
ASM_1(161); ASM_4(MEM_GetIntAddress(src0));
ASM_1(80);
ASM_1(232); ASM_4(8244256/*0x7DCC20*/-ASM_Here()-4);
ASM_1(163); ASM_4(MEM_GetIntAddress(dest0));
ASM_1(137); ASM_1(21); ASM_4(MEM_GetIntAddress(dest4));
div64_asm = ASM_Close();
};
ASM_Run(div64_asm);
MEM_WriteInt(dest, dest0);
MEM_WriteInt(dest+4, dest4);
if (sign == -1) { neg64(dest); };
if (ptr) { MEM_Free(ptr); };
};