alloc(TypeName,256) 
alloc(ByteSize,4) 
alloc(PreferedAlignment, 4) 
alloc(ConvertRoutine,1024) 
alloc(ConvertBackRoutine,1024) 
TypeName: 
db 'RPG VX type',0 
ByteSize: 
dd 4 
PreferedAlignment: 
dd 1 
//The convert routine should hold a routine that converts the data to an nteger (in eax) 
//function declared as: stdcall int ConvertRoutine(unsigned char *input); 
//Note: Keep in mind that this routine can be called by multiple threads at the same time. 
ConvertRoutine: 
[32-bit] 
push ebp 
mov ebp,esp 
push ecx 
mov ecx,[ebp+8] 
[/32-bit] 
//at this point ecx contains the address where the bytes are stored 
//put the bytes into the eax register 
mov eax,[ecx] //second fun fact, addressing with 32-bit registers doesn't work in 64-bit, it becomes a 64-bit automatically (most of the time) 
shr eax,1 //shift right by 1 bit (divide by 2) 
//and now exit the routine 
[64-bit] 
ret 
[/64-bit] 
[32-bit] 
pop ecx 
pop ebp 
ret 4 
[/32-bit] 
//The convert back routine should hold a routine that converts the given integer back to a row of bytes (e.g when the user wats to write a new value) 
//function declared as: stdcall void ConvertBackRoutine(int i, unsigned char *output); 
ConvertBackRoutine: 
[32-bit] 
push ebp 
mov ebp,esp 
push edx //save the registers 
push ecx 
mov edx,[ebp+0c] 
mov ecx,[ebp+08] 
[/32-bit] 
//at this point edx contains the address to write the value to 
//and ecx contains the value 
push eax 
push edx 
mov edx,[edx] //edx now contains the original value 
and edx,1 //only save the first bit 
mov eax,ecx //eax gets the user input value 
shl eax,1 //shift left by 1 bit (multiply by 2) 
or eax,edx //add the bits of the original value 
pop edx 
mov [edx],eax //write the new value into the old value 
pop eax 
[64-bit] 
//everything is back to what it was, so exit 
ret 
[/64-bit] 
[32-bit] 
//cleanup first 
pop ecx 
pop edx 
pop ebp 
ret 8 
[/32-bit]