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 */ }
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 ); }
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); }
/* * 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); }
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 */ }