unsigned int write_track_block(TZX_FILE *pTZXfile, struct membuf tracks[], int first_track, int last_track) { char blockbuf[MAX_BLOCK_SIZE]; int track; int track_count = last_track - first_track + 1; int block_ptr = (track_count+1) * 2; // space for pointer table at start plus 0x0000 terminator int block_tbl_ptr = 0; printf("writing tracks %d-%d\n", first_track, last_track); memset(blockbuf, 0, MAX_BLOCK_SIZE); for (track = first_track; track <= last_track; track++) { int track_len = membuf_memlen(&tracks[track]); if (track_len > 0) // skip null tracks { memcpy(blockbuf+block_ptr, membuf_get(&tracks[track]), track_len); blockbuf[block_tbl_ptr++] = block_ptr & 0xff; blockbuf[block_tbl_ptr++] = block_ptr >> 8; membuf_free(&tracks[track]); block_ptr += track_len; } }
void membuf_delete(struct membuf **sbp) { struct membuf *sb; sb = *sbp; membuf_free(sb); free(sb); sb = NULL; *sbp = sb; }
static int membuf_release(struct inode *in, struct file *file) { struct membuf *buf = (struct membuf *)file->private_data; membuf_unmap(buf); membuf_free(buf); kfree(buf); return 0; }
void sbe_free(struct sbe *e) { membuf_free(e->mb); }