⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.c

📁 俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)的全部源代码。
💻 C
字号:
/* * io.c -- all the code to make GCC and the libraries run on *         a bare target board. */#include <sys/types.h>#include <sys/stat.h>#include <errno.h>#include "hppa-defs.h"extern char *_end;                /* _end is set in the linker command file *//* just in case, most boards have at least some memory */#ifndef RAMSIZE#  define RAMSIZE             (char *)0x100000#endifintprint(ptr)char *ptr;{  while (*ptr)    outbyte (*ptr++);}intputnum (Num)unsigned int Num;{  char	Buffer[9];  int	Count;  char	*BufPtr = Buffer;  int	Digit;    for (Count = 7 ; Count >= 0 ; Count--) {    Digit = (Num >> (Count * 4)) & 0xf;        if (Digit <= 9)      *BufPtr++ = (char) ('0' + Digit);    else      *BufPtr++ = (char) ('a' - 10 + Digit);  }  *BufPtr = (char) 0;  print (Buffer);  return;}intdelay (x)     int x;{  int  y = 17;  while (x-- !=0)    y = y^2;}/* * strobe -- do a zylons thing, toggling each led in sequence forever... */intzylons(){  while (1) {    strobe();  }}/* * strobe -- toggle each led in sequence up and back once. */intstrobe(){  static unsigned char curled = 1;  static unsigned char dir = 0;  curled = 1;  dir = 0;  while (curled != 0) {    led_putnum (curled);    delay (70000);    if (dir)      curled >>= 1;    else      curled <<= 1;        if (curled == 128) {      dir = ~dir;    }  }  curled = 1;  dir = 0;}/* * iodc_io_call -- this makes a call into the IODC routine */intiodc_io_call(ep_address,arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)int ep_address, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11;{   int         (*iodc_entry_point)();    iodc_entry_point = (int (*)())ep_address;  return ((*iodc_entry_point)(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11));}/* * pdc_call -- this makes a call into the PDC routine */intpdc_call(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11)     int arg0, arg1, arg2, arg3,  arg4, arg5;     int arg6, arg7, arg9, arg10, arg11;{   return ( CALL_PDC(arg0,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11));}/* * put_led -- put a bit pattern on the LED's.  */intled_putnum (byte)     unsigned short byte;{  return (pdc_call(OPT_PDC_CHASSIS,0,byte));}/* * outbyte -- shove a byte out the serial port */intoutbyte(byte)     unsigned char byte;{  int status;  int R_addr[32];  struct _dev *console = (struct _dev *)PGZ_CONSOLE_STRUCT;  status = iodc_io_call(console->iodc_io, console->hpa, IO_CONSOLE_OUTPUT, console->spa,			console->layer[0], R_addr, 0, &byte, 1,	0);  switch(status)    {    case 0:  return(1);    default: return (-1);    }}/* * inbyte -- get a byte from the serial port */unsigned charinbyte(){  int status;  int R_addr[32];  char inbuf;  struct _dev *console = (struct _dev *)PGZ_CONSOLE_STRUCT;  while (status == 0) {    status = iodc_io_call(console->iodc_io, console->hpa, IO_CONSOLE_INPUT, console->spa,			  console->layer[0], R_addr, 0, &inbuf, 1, 0);        switch (status) {    case 0:    case 2:  					/* recoverable error */      if (R_addr[0] != 0) {			/* found a character */	return(inbuf);      }      else	break; 					/* error, no character */    default: 					/* error, no character */      return(0);	    }  }}/* * read  -- read bytes from the serial port. Ignore fd, since *          we only have stdin. */intread(fd, buf, nbytes)     int fd;     char *buf;     int nbytes;{  int i = 0;    for (i = 0; i < nbytes; i++) {    *(buf + i) = inbyte();    if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {      (*(buf + i)) = 0;      break;    }  }  return (i);}/* * write -- write bytes to the serial port. Ignore fd, since *          stdout and stderr are the same. Since we have no filesystem, *          open will only return an error. */intwrite(fd, buf, nbytes)     int fd;     char *buf;     int nbytes;{  int i;  for (i = 0; i < nbytes; i++) {    if (*(buf + i) == '\n') {      outbyte ('\r');    }    outbyte (*(buf + i));  }  return (nbytes);}/* * open -- open a file descriptor. We don't have a filesystem, so *         we return an error. */intopen(buf, flags, mode)     char *buf;     int flags;     int mode;{  errno = EIO;  return (-1);}/* * close -- close a file descriptor. We don't need *          to do anything, but pretend we did. */intclose(fd)     int fd;{  return (0);}/* * sbrk -- changes heap size size. Get nbytes more *         RAM. We just increment a pointer in what's *         left of memory on the board. */char *sbrk(nbytes)     int nbytes;{  static char * heap_ptr = NULL;  char *        base;  if (heap_ptr == NULL) {    heap_ptr = (char *)&_end;  }  if ((RAMSIZE - heap_ptr) >= 0) {    base = heap_ptr;    heap_ptr += nbytes;    return (heap_ptr);  } else {    errno = ENOMEM;    return ((char *)-1);  }}/* * isatty -- returns 1 if connected to a terminal device, *           returns 0 if not. Since we're hooked up to a *           serial port, we'll say yes return a 1. */intisatty(fd)     int fd;{  return (1);}/* * lseek -- move read/write pointer. Since a serial port *          is non-seekable, we return an error. */off_tlseek(fd,  offset, whence)     int fd;     off_t offset;     int whence;{  errno = ESPIPE;  return ((off_t)-1);}/* * fstat -- get status of a file. Since we have no file *          system, we just return an error. */intfstat(fd, buf)     int fd;     struct stat *buf;{  errno = EIO;  return (-1);}/* * getpid -- only one process, so just return 1. */#define __MYPID 1intgetpid(){  return __MYPID;}/* * kill -- assume mvme.S, and go out via exit... */intkill(pid, sig)     int pid;     int sig;{  if(pid == __MYPID)    _exit(sig);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -