~crc_/retroforth

5d34094ff0a25186238941c05a69eeea57a5fd32 — crc 1 year, 5 months ago ce03a85
nga-c: split malloc and rng devices into separate files

FossilOrigin-Name: 226d56002e03e440e9fbdde22db6cfcc9b037f4608431823f7c5d8e08d8fadef
3 files changed, 130 insertions(+), 104 deletions(-)

A vm/nga-c/dev-malloc.c
A vm/nga-c/dev-rng.c
M vm/nga-c/retro.c
A vm/nga-c/dev-malloc.c => vm/nga-c/dev-malloc.c +88 -0
@@ 0,0 1,88 @@
/*---------------------------------------------------------------------
  Copyright (c) 2008 - 2022, Charles Childers

  Portions are based on Ngaro, which was additionally copyright
  by the following:

  Copyright (c) 2009 - 2010, Luke Parrish
  Copyright (c) 2010,        Marc Simpson
  Copyright (c) 2010,        Jay Skeer
  Copyright (c) 2011,        Kenneth Keating
  ---------------------------------------------------------------------*/

#ifdef ENABLE_MALLOC
#ifdef BIT64
typedef union {
  void* val;
  struct {
    CELL msw;
    CELL lsw;
  };
} double_cell;

void double_add(NgaState *vm) {
  double_cell a;
  double_cell b;
  double_cell c;
  b.msw = stack_pop(vm);
  b.lsw = stack_pop(vm);
  a.msw = stack_pop(vm);
  a.lsw = stack_pop(vm);
}

void double_sub(NgaState *vm) {
}

void double_mul(NgaState *vm) {
}

void double_divmod(NgaState *vm) {
}

void malloc_allocate(NgaState *vm) {
  stack_push(vm, (CELL)malloc(stack_pop(vm)));
}

void malloc_free(NgaState *vm) {
  free((CELL*)stack_pop(vm));
}

void malloc_store(NgaState *vm) {
  CELL value = stack_pop(vm);
  double_cell addr;
  *(CELL *) stack_pop(vm) = value;
}

void malloc_fetch(NgaState *vm) {
  double_cell addr;
  CELL value = *(CELL *)stack_pop(vm);
  stack_push(vm, value);
}

void malloc_realloc(NgaState *vm) {
  CELL bytes = stack_pop(vm);
  CELL* addr1;
  addr1 = (CELL*)stack_pop(vm);
  CELL* addr2;
  addr2 = (CELL*)realloc(addr1, bytes);
  stack_push(vm, (CELL)addr2);
}

void query_malloc(NgaState *vm) {
  stack_push(vm, 0);
  stack_push(vm, 15);
}

void io_malloc(NgaState *vm) {
  int i = stack_pop(vm);
  switch (i) {
    case 0: malloc_allocate(vm); return;
    case 1: malloc_free(vm); return;
    case 2: malloc_store(vm); return;
    case 3: malloc_fetch(vm); return;
    case 4: malloc_realloc(vm); return;
  }
  stack_push(vm, -1);
}
#endif
#endif

A vm/nga-c/dev-rng.c => vm/nga-c/dev-rng.c +38 -0
@@ 0,0 1,38 @@
/*---------------------------------------------------------------------
  Copyright (c) 2008 - 2022, Charles Childers

  Portions are based on Ngaro, which was additionally copyright
  by the following:

  Copyright (c) 2009 - 2010, Luke Parrish
  Copyright (c) 2010,        Marc Simpson
  Copyright (c) 2010,        Jay Skeer
  Copyright (c) 2011,        Kenneth Keating
  ---------------------------------------------------------------------*/

/* Random Number Generator --------------------------------------------*/
#ifdef ENABLE_RNG
void io_rng(NgaState *vm) {
  int64_t r = 0;
  char buffer[8];
  int i;
  ssize_t ignore;
  int fd = open("/dev/urandom", O_RDONLY);
  ignore = read(fd, buffer, 8);
  close(fd);
  for(i = 0; i < 8; ++i) {
    r = r << 8;
    r += ((int64_t)buffer[i] & 0xFF);
  }
#ifndef BIT64
  stack_push(vm, (CELL)abs((CELL)r));
#else
  stack_push(vm, (CELL)llabs((CELL)r));
#endif
}

void query_rng(NgaState *vm) {
  stack_push(vm, 0);
  stack_push(vm, 10);
}
#endif

M vm/nga-c/retro.c => vm/nga-c/retro.c +4 -104
@@ 239,78 239,7 @@ void guard(NgaState *vm, int n, int m, int diff) {
/* Dynamic Memory / `malloc` support --------------------------------- */
#ifdef ENABLE_MALLOC
#ifdef BIT64
typedef union {
  void* val;
  struct {
    CELL msw;
    CELL lsw;
  };
} double_cell;

void double_add(NgaState *vm) {
  double_cell a;
  double_cell b;
  double_cell c;
  b.msw = stack_pop(vm);
  b.lsw = stack_pop(vm);
  a.msw = stack_pop(vm);
  a.lsw = stack_pop(vm);
}

void double_sub(NgaState *vm) {
}

void double_mul(NgaState *vm) {
}

void double_divmod(NgaState *vm) {
}

void malloc_allocate(NgaState *vm) {
  stack_push(vm, (CELL)malloc(stack_pop(vm)));
}

void malloc_free(NgaState *vm) {
  free((CELL*)stack_pop(vm));
}

void malloc_store(NgaState *vm) {
  CELL value = stack_pop(vm);
  double_cell addr;
  *(CELL *) stack_pop(vm) = value;
}

void malloc_fetch(NgaState *vm) {
  double_cell addr;
  CELL value = *(CELL *)stack_pop(vm);
  stack_push(vm, value);
}

void malloc_realloc(NgaState *vm) {
  CELL bytes = stack_pop(vm);
  CELL* addr1;
  addr1 = (CELL*)stack_pop(vm);
  CELL* addr2;
  addr2 = (CELL*)realloc(addr1, bytes);
  stack_push(vm, (CELL)addr2);
}

void query_malloc(NgaState *vm) {
  stack_push(vm, 0);
  stack_push(vm, 15);
}

void io_malloc(NgaState *vm) {
  int i = stack_pop(vm);
  switch (i) {
    case 0: malloc_allocate(vm); return;
    case 1: malloc_free(vm); return;
    case 2: malloc_store(vm); return;
    case 3: malloc_fetch(vm); return;
    case 4: malloc_realloc(vm); return;
  }
  stack_push(vm, -1);
}
#include "dev-malloc.c"
#endif
#endif



@@ 357,6 286,8 @@ void query_blocks(NgaState *vm) {
}
#endif

#include "dev-files.c"

/* Multi Core Support ------------------------------------------------ */
#ifdef ENABLE_MULTICORE
#include "dev-multicore.c"


@@ 370,45 301,14 @@ void query_blocks(NgaState *vm) {
#include "dev-float.c"
#endif


/* FileSystem Device ------------------------------------------------- */

#include "dev-files.c"

/* Time and Date Functions --------------------------------------------*/
#ifdef ENABLE_CLOCK
#include "dev-clock.c"
#endif


/* Random Number Generator --------------------------------------------*/
#ifdef ENABLE_RNG
void io_rng(NgaState *vm) {
  int64_t r = 0;
  char buffer[8];
  int i;
  ssize_t ignore;
  int fd = open("/dev/urandom", O_RDONLY);
  ignore = read(fd, buffer, 8);
  close(fd);
  for(i = 0; i < 8; ++i) {
    r = r << 8;
    r += ((int64_t)buffer[i] & 0xFF);
  }
#ifndef BIT64
  stack_push(vm, (CELL)abs((CELL)r));
#else
  stack_push(vm, (CELL)llabs((CELL)r));
#endif
}

void query_rng(NgaState *vm) {
  stack_push(vm, 0);
  stack_push(vm, 10);
}
#include "dev-rng.c"
#endif


#ifdef ENABLE_SOCKETS
#include "dev-sockets.c"
#endif