#ifndef EMU_COMPILE
#error "Hi I forgot to set EMU_COMPILE"
#endif
#include "bios.h"
static uint8 *image = {0};
static uint32 image_size = 0;
uint8* EMU_CALL bios_get_image_native(void) { return image; }
uint32 EMU_CALL bios_get_imagesize(void) { return image_size; }
void EMU_CALL bios_set_image(uint8 *_image, uint32 _size) {
#ifdef EMU_BIG_ENDIAN
uint32 i;
for (i = 0; i < _size; i += 4) {
uint8 a = _image[i + 0];
uint8 b = _image[i + 1];
_image[i + 0] = _image[i + 3];
_image[i + 1] = _image[i + 2];
_image[i + 2] = b;
_image[i + 3] = a;
}
#endif
image = _image;
image_size = _size;
}
sint32 EMU_CALL bios_getenv(
const char *name,
char *dest,
sint32 dest_l
) {
uint8 *romnative = bios_get_image_native();
uint8 whole_env_area[129];
uint8 *env;
uint8 *banner = "Highly Experimental";
sint32 banner_l = strlen(banner);
sint32 name_l = strlen(name);
sint32 i;
for(i = 0; i < 128; i++) {
sint32 byteofs = 0x80 + (i ^ (EMU_ENDIAN_XOR(3)));
whole_env_area[i] = romnative[byteofs];
}
whole_env_area[128] = 0;
env = whole_env_area;
if(!dest_l) return 1;
if(memcmp(env, banner, banner_l)) return 1;
env += banner_l;
for(;;) {
sint32 isquote = 0;
uint8 *varnamestart;
uint8 *varnameend;
uint8 *varvalstart;
uint8 *varvalend;
sint32 varnamelen;
sint32 varvallen;
for(;; env++) { uint8 c = *env; if(!c) return 1; if(c != ' ') break; }
varnamestart = env;
for(;; env++) { uint8 c = *env; if(!c) return 1; if(c == '=') break; }
varnameend = env;
while(
(varnameend > varnamestart) &&
(varnameend[-1] == ' ')
) varnameend--;
env++;
varnamelen = varnameend - varnamestart;
for(;; env++) { uint8 c = *env; if(!c) return 1; if(c != ' ') break; }
varvalstart = env;
if(*env == '\"') { varvalstart++; env++; isquote = 1; }
for(;; env++) {
uint8 c = *env;
if(!c) break;
if(isquote && c == '\"') break;
if((!isquote) && c == ' ') break;
}
varvalend = env;
if(isquote && *env == '\"') env++;
varvallen = varvalend - varvalstart;
if(varnamelen == name_l && !memcmp(varnamestart, name, name_l)) {
if(varvallen > (dest_l - 1)) varvallen = (dest_l - 1);
if(varvallen) memcpy(dest, varvalstart, varvallen);
dest[varvallen] = 0;
return 0;
}
}
return 1;
}