unsafe void convert_filename(BytePtr srcname, BytePtr destname, ref FileAccessMode filemode, ref FileType filetype) { byte *p; // Search for ':', p points to first character after ':' if ((p = CharFunctions.strchr(srcname, ':')) != null) { p++; } else { p = srcname; } // Remaining string -> destname CharFunctions.strncpy(destname, srcname, p); // Look for mode parameters seperated by ',' p = destname; while ((p = CharFunctions.strchr(p, ',')) != null) { // Cut string after the first ',' *p++ = 0; switch ((Char)(*p)) { case 'P': filetype = FileType.FTYPE_PRG; break; case 'S': filetype = FileType.FTYPE_SEQ; break; case 'U': filetype = FileType.FTYPE_USR; break; case 'L': filetype = FileType.FTYPE_REL; break; case 'R': filemode = FileAccessMode.FMODE_READ; break; case 'W': filemode = FileAccessMode.FMODE_WRITE; break; case 'A': filemode = FileAccessMode.FMODE_APPEND; break; } } }
unsafe void convert_filename(byte *srcname, byte *destname, ref FileAccessMode filemode, ref FileType filetype, ref bool wildflag) { byte *p, q; // Search for ':', p points to first character after ':' if ((p = CharFunctions.strchr(srcname, ':')) != null) { p++; } else { p = srcname; } // Convert char set of the remaining string -> destname q = destname; for (int i = 0; i < IEC.NAMEBUF_LENGTH && (*q++ = conv_from_64(*p++, true)) != 0; i++) { ; } // Look for mode parameters seperated by ',' p = destname; while ((p = CharFunctions.strchr(p, ',')) != null) { // Cut string after the first ',' *p++ = 0; switch ((Char)(*p)) { case 'p': filetype = FileType.FTYPE_PRG; break; case 's': filetype = FileType.FTYPE_SEQ; break; case 'r': filemode = FileAccessMode.FMODE_READ; break; case 'w': filemode = FileAccessMode.FMODE_WRITE; break; case 'a': filemode = FileAccessMode.FMODE_APPEND; break; } } // Search for wildcards wildflag = CharFunctions.strchr(destname, '?') != null || CharFunctions.strchr(destname, '*') != null; }
unsafe byte open_directory(byte *pattern) { int i, j, n, m; byte * p, q; DirEntry *de; byte c; byte * tmppat; // Special treatment for "$0" if (pattern[0] == '0' && pattern[1] == 0) { pattern += 1; } // Skip everything before the ':' in the pattern if ((tmppat = CharFunctions.strchr(pattern, ':')) != null) { pattern = tmppat + 1; } AllocateChannelBuffer(0, 8192); p = buf_ptr[0] = chan_buf[0]; chan_mode[0] = ChannelMode.CHMOD_DIRECTORY; // Create directory title *p++ = 0x01; // Load address $0401 (from PET days :-) *p++ = 0x04; *p++ = 0x01; // Dummy line link *p++ = 0x01; *p++ = 0; // Drive number (0) as line number *p++ = 0; *p++ = 0x12; // RVS ON *p++ = (byte)'\"'; q = bam->disk_name; for (i = 0; i < 23; i++) { if ((c = *q++) == 0xa0) { *p++ = (byte)' '; // Replace 0xa0 by space } else { *p++ = c; } } *(p - 7) = (byte)'\"'; *p++ = 0; // Scan all directory blocks dir.next_track = bam->dir_track; dir.next_sector = bam->dir_sector; fixed(Directory *dd = &dir) { while (dir.next_track != 0x00) { if (!read_sector(dir.next_track, dir.next_sector, &dd->next_track)) { return((byte)C64StatusCode.ST_OK); } DirEntry *ade = (DirEntry *)dd->entry; // Scan all 8 entries of a block for (j = 0; j < 8; j++) { de = &ade[j]; if (de->type != 0 && match(pattern, de->name)) { *p++ = 0x01; // Dummy line link *p++ = 0x01; *p++ = de->num_blocks_l; // Line number *p++ = de->num_blocks_h; *p++ = (byte)' '; n = (de->num_blocks_h << 8) + de->num_blocks_l; if (n < 10) { *p++ = (byte)' '; } if (n < 100) { *p++ = (byte)' '; } *p++ = (byte)'\"'; q = de->name; m = 0; for (i = 0; i < 16; i++) { if ((c = *q++) == 0xa0) { if (m != 0) { *p++ = (byte)' '; // Replace all 0xa0 by spaces } else { m = *p++ = (byte)'\"'; // But the first by a '"' } } else { *p++ = c; } } if (m != 0) { *p++ = (byte)' '; } else { *p++ = (byte)'\"'; // No 0xa0, then append a space } if ((de->type & 0x80) != 0) { *p++ = (byte)' '; } else { *p++ = (byte)'*'; } *p++ = type_char_1[de->type & 0x0f]; *p++ = type_char_2[de->type & 0x0f]; *p++ = type_char_3[de->type & 0x0f]; if ((de->type & 0x40) != 0) { *p++ = (byte)'<'; } else { *p++ = (byte)' '; } *p++ = (byte)' '; if (n >= 10) { *p++ = (byte)' '; } if (n >= 100) { *p++ = (byte)' '; } *p++ = 0; } } } } // Final line q = p; for (i = 0; i < 29; i++) { *q++ = (byte)' '; } n = 0; for (i = 0; i < 35; i++) { n += bam->bitmap[i * 4]; } *p++ = 0x01; // Dummy line link *p++ = 0x01; *p++ = (byte)(n & 0xff); // Number of free blocks as line number *p++ = (byte)((n >> 8) & 0xff); *p++ = (byte)'B'; *p++ = (byte)'L'; *p++ = (byte)'O'; *p++ = (byte)'C'; *p++ = (byte)'K'; *p++ = (byte)'S'; *p++ = (byte)' '; *p++ = (byte)'F'; *p++ = (byte)'R'; *p++ = (byte)'E'; *p++ = (byte)'E'; *p++ = (byte)'.'; p = q; *p++ = 0; *p++ = 0; *p++ = 0; buf_len[0] = (int)(p - chan_buf[0]); return((byte)C64StatusCode.ST_OK); }