ftp.nice.ch/pub/next/developer/languages/c/djgpp-NS.s.tar.gz#/djgpp/go32/ed/ed.c

This is ed.c in view mode; [Download] [Up]

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

#define far

#include "ed.h"
#include "paging.h"
#include "unassmbl.h"
#include "debug.h"

void movedata(int srcseg, int srcofs, int destseg, int destofs, int length);

ExternalDebuggerInfo edi;
TSS a_tss;
AREAS areas[MAX_AREA];

static int my_ds;
static int app_ds;
static int edi_seg;
static int edi_ofs;

void edi_init()
{
  int i;
  asm("movw $0xfe01,%ax");
  asm("int $0x21");
  asm("movl %edx,_edi_seg");
  asm("movl %eax,_edi_ofs");
  asm("xor  %eax,%eax");
  asm("movw %ds,%ax");
  asm("movl %eax,_my_ds");
  movedata(edi_seg, edi_ofs, my_ds, (int)(&edi), sizeof(edi));
  movedata(edi.a_tss_seg, edi.a_tss_ofs, my_ds, (int)(&a_tss), sizeof(TSS));
  app_ds = a_tss.tss_ds;
  movedata(edi.areas_seg, edi.areas_ofs, my_ds, (int)areas, sizeof(areas));
  for (i=0; i<MAX_AREA; i++)
  {
    areas[i].first_addr -= edi.app_base;
    areas[i].last_addr -= edi.app_base;
  }
}

void run_child(void)
{
  int i;
  movedata(my_ds, (int)(&edi), edi_seg, edi_ofs, sizeof(edi));
  movedata(my_ds, (int)(&a_tss), edi.a_tss_seg, edi.a_tss_ofs, sizeof(TSS));
  asm("movw $0xfe00,%ax");
  asm("int $0x21");
  movedata(edi_seg, edi_ofs, my_ds, (int)(&edi), sizeof(edi));
  movedata(edi.a_tss_seg, edi.a_tss_ofs, my_ds, (int)(&a_tss), sizeof(TSS));

  movedata(edi.areas_seg, edi.areas_ofs, my_ds, (int)areas, sizeof(areas));
  for (i=0; i<MAX_AREA; i++)
  {
    areas[i].first_addr -= edi.app_base;
    areas[i].last_addr -= edi.app_base;
  }
}

static int invalid_addr(word32 a, unsigned len)
{
  int i;
  if ((int)invalid_addr > 0)
    return 0;
  for (i=0; i<MAX_AREA; i++)
    if (a>=areas[i].first_addr && (a+len-1) <= areas[i].last_addr)
      return 0;
  printf("Invalid access to child, address %#x length %#x\n", a, len);
  if (can_longjmp)
    longjmp(debugger_jmpbuf, 1);
  return 1;
}

int read_child(word32 child_addr, void *buf, unsigned len)
{
  if (invalid_addr(child_addr, len))
    return 1;
  movedata(app_ds, child_addr, my_ds, (int)buf, len);
  return 0;
}

int write_child(word32 child_addr, void *buf, unsigned len)
{
  if (invalid_addr(child_addr, len))
    return 1;
  movedata(my_ds, (int)buf, app_ds, child_addr, len);
  return 0;
}

void ansi(int fg)
{
  if (!edi.ansi_mode)
    return;
  printf("\033[%d;%dm", (fg & A_bold) ? 1 : 0, 30+(fg&7));
}

int main()
{
  char *fn;
  int i, v;

  edi_init();

  fn = (char *)malloc(edi.filename_len + 1);
  movedata(edi.filename_seg, edi.filename_ofs, my_ds, (int)(fn), edi.filename_len+1);
/*
  printf("text: %#08x - %#08x\n", areas[A_text].first_addr, areas[A_text].last_addr);
  printf("data: %#08x - %#08x\n", areas[A_data].first_addr, areas[A_data].last_addr);
  printf("bss:  %#08x - %#08x\n", areas[A_bss].first_addr, areas[A_bss].last_addr);
  */
  syms_init(fn);

  debugger();

  return 0;
}

void *sbrk(int l)
{
  extern int end;
  static int sold = (int)&end;
  sold += l;
  return (void *)(sold-l);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.