示例#1
0
static void
fat_init( Bytes  fat )
{
    POKEW( fat,     0x0ffffff8 );  /* reserve cluster 1, media id in low byte */
    POKEW( fat + 4, 0x0fffffff );  /* reserve cluster 2 */
    POKEW( fat + 8, 0x0fffffff );  /* end of clust chain for root dir */
}
示例#2
0
static void
boot_sector_init( Bytes  boot, Bytes  info, Wide   disk_size, const char*  label )
{
    int   sectors_per_cluster = get_sectors_per_cluster(disk_size);
    int   sectors_per_fat    = get_sectors_per_fat(disk_size, sectors_per_cluster);
    int   sectors_per_disk   = (int)(disk_size / BYTES_PER_SECTOR);
    int   serial_id          = get_serial_id();
    int   free_count;

    if (label == NULL)
        label = "SDCARD";

    POKEB(boot, 0xeb);
    POKEB(boot+1, 0x5a);
    POKEB(boot+2, 0x90);
    strcpy( (char*)boot + 3, "MSWIN4.1" );
    POKES( boot + 0x0b, BYTES_PER_SECTOR );    /* sector size */
    POKEB( boot + 0xd, sectors_per_cluster );  /* sectors per cluster */
    POKES( boot + 0xe, RESERVED_SECTORS );     /* reserved sectors before first FAT */
    POKEB( boot + 0x10, NUM_FATS );            /* number of FATs */
    POKES( boot + 0x11, 0 );                   /* max root directory entries for FAT12/FAT16, 0 for FAT32 */
    POKES( boot + 0x13, 0 );                   /* total sectors, 0 to use 32-bit value at offset 0x20 */
    POKEB( boot + 0x15, 0xF8 );                /* media descriptor, 0xF8 == hard disk */
    POKES( boot + 0x16, 0 );                   /* Sectors per FAT for FAT12/16, 0 for FAT32 */
    POKES( boot + 0x18, 9 );                   /* Sectors per track (whatever) */
    POKES( boot + 0x1a, 2 );                   /* Number of heads (whatever) */
    POKEW( boot + 0x1c, 0 );                   /* Hidden sectors */
    POKEW( boot + 0x20, sectors_per_disk );    /* Total sectors */

    /* extension */
    POKEW( boot + 0x24, sectors_per_fat );       /* Sectors per FAT */
    POKES( boot + 0x28, 0 );         /* FAT flags */
    POKES( boot + 0x2a, 0 );         /* version */
    POKEW( boot + 0x2c, 2 );         /* cluster number of root directory start */
    POKES( boot + 0x30, 1 );         /* sector number of FS information sector */
    POKES( boot + 0x32, BACKUP_BOOT_SECTOR );         /* sector number of a copy of this boot sector */
    POKEB( boot + 0x40, 0x80 );      /* physical drive number */
    POKEB( boot + 0x42, 0x29 );      /* extended boot signature ?? */
    POKEW( boot + 0x43, serial_id ); /* serial ID */
    strncpy( (char*)boot + 0x47, label, 11 );  /* Volume Label */
    memcpy( boot + 0x52, "FAT32   ", 8 );  /* FAT system type, padded with 0x20 */

    POKEB( boot + BYTES_PER_SECTOR-2, 0x55 );    /* boot sector signature */
    POKEB( boot + BYTES_PER_SECTOR-1, 0xAA );

    /* FSInfo sector */
    free_count = sectors_per_disk - 32 - 2*sectors_per_fat;

    POKEW( info + 0,   0x41615252 );
    POKEW( info + 484, 0x61417272 );
    POKEW( info + 488, free_count );   /* number of free clusters */
    POKEW( info + 492, 3 );            /* next free clusters, 0-1 reserved, 2 is used for the root dir */
    POKEW( info + 508, 0xAA550000 );
}
示例#3
0
文件: pcpkt2.c 项目: basecq/q2dos
struct pkt_rx_element *pkt_poll_recv (void)
{
  struct pkt_rx_element *rc;
  WORD   out_idx = PEEKW (0, QUE_OFS(out_index));
  WORD   in_idx  = PEEKW (0, QUE_OFS(in_index));

  if (out_idx != in_idx)
  {
    static struct pkt_rx_element rx_buf;
    struct pkt_ringbuf *q = &_pkt_inf->pkt_queue;
    DWORD  addr = ASMPKT_INF + offsetof(PKT_INFO,rx_buf[out_idx]);

    /* It might be faster to copy whole thing (head and rx-buffer)
     * in one operation ??
     */
    pullup_rx_element (&rx_buf, addr, RX_ELEMENT_HEAD_SIZE);

    if (check_rx_element(&rx_buf))
    {
      BYTE *pad;
      int   pad_len, size;

      get_tstamp (rx_buf.tstamp_get);
      size    = min (rx_buf.rx_length_1, q->buf_size - 4 - RX_ELEMENT_HEAD_SIZE);
      pad_len = q->buf_size - 4 - RX_ELEMENT_HEAD_SIZE - size;
      addr   += RX_ELEMENT_HEAD_SIZE;
      pullup_rx_element (&rx_buf.rx_buf, addr, ROUND_UP32(size));
      if (pad_len > 0)
      {
        pad = &rx_buf.rx_buf[0] + size;
        memset (pad, 0, pad_len);
      }
      rc = &rx_buf;
    }
    else
    {
      TCP_CONSOLE_MSG (1, ("pkt-error %s\n", pkt_error));
      rc = NULL;
    }

    if (++out_idx >= q->num_buf)
       out_idx = 0;
    POKEW (0, QUE_OFS(out_index), out_idx);
    return (rc);
  }
  return (NULL);
}
示例#4
0
文件: pcpkt2.c 项目: basecq/q2dos
/*
 * Append a transmit buffer at end of receive buffer.
 * Must not be called before checking if there is room.
 */
int pkt_append_recv (const void *tx, unsigned len)
{
  struct pkt_rx_element buf;
  struct pkt_ringbuf   *q = &_pkt_inf->pkt_queue;
  DWORD  addr;
  int    idx;

  DISABLE();
  idx = PEEKW (0, QUE_OFS(in_index));

  if (idx < 0 || idx >= q->num_buf)
  {
#if defined(USE_DEBUG)
    (*_printf) ("pkt_append_recv(): illegal index %d\n", idx);
 /* pkt_dump_real_mem(); */
#endif
    ENABLE();
    return (0);
  }

  buf.rx_length_1 = buf.rx_length_2 = len;
  buf.handle      = _pkt_inf->handle;
  buf.filler      = 0;
  get_tstamp (buf.tstamp_put);

  addr = ASMPKT_INF + offsetof (PKT_INFO, rx_buf[idx]);

#if (DOSX & (PHARLAP|POWERPAK|X32VM))
  WriteRealMem (addr, &buf, RX_ELEMENT_HEAD_SIZE);
#elif (DOSX & DOS4GW)
  memcpy ((void*)addr, &buf, RX_ELEMENT_HEAD_SIZE);
#elif (DOSX & DJGPP)
  DOSMEMPUTL (&buf, RX_ELEMENT_HEAD_SIZE/4, addr);
#elif (DOSX == 0)
  memcpy ((void*)addr, &buf, RX_ELEMENT_HEAD_SIZE);
#else
  #error Help me!
#endif

  addr += RX_ELEMENT_HEAD_SIZE;

#if (DOSX & (PHARLAP|POWERPAK|X32VM))
  WriteRealMem (addr, (void*)tx, len);
#elif (DOSX & DOS4GW)
  memcpy ((void*)addr, tx, len);
#elif (DOSX & DJGPP)
  DOSMEMPUTL (tx, (len+3)/4, addr);
#elif (DOSX == 0)
  memcpy ((void*)addr, tx, len);
#else
  #error Help me!
#endif

  if (++idx == q->num_buf)
     idx = 0;

  POKEW (0, QUE_OFS(in_index), idx);
  ENABLE();
/* pkt_dump_real_mem(); */
  return (len);
}
示例#5
0
static void fat_init(u8* fat)
{
	POKEW(fat, 0x0ffffff8);	/* Reserve cluster 1, media id in low byte */
	POKEW(fat + 4, 0x0fffffff);	/* Reserve cluster 2 */
	POKEW(fat + 8, 0x0fffffff);	/* End of cluster chain for root dir */
}