CBM directory routines by Josef Soucek
git-svn-id: svn://svn.cc65.org/cc65/trunk@1920 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
70e920f84c
commit
90f47ed007
4 changed files with 194 additions and 2 deletions
|
@ -110,6 +110,36 @@ extern unsigned char _filetype; /* Default 'u' */
|
|||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Definitions for directory reading functions */
|
||||
/*****************************************************************************/
|
||||
|
||||
|
||||
|
||||
/* CBM FILE TYPES */
|
||||
#define CBM_T_DEL 0
|
||||
#define CBM_T_SEQ 1
|
||||
#define CBM_T_PRG 2
|
||||
#define CBM_T_USR 3
|
||||
#define CBM_T_REL 4
|
||||
#define CBM_T_CBM 5 /* 1581 sub-partition */
|
||||
#define CBM_T_DIR 6 /* IDE64 and CMD sub-directory */
|
||||
#define CBM_T_VRP 8 /* Vorpal fast-loadable format */
|
||||
#define CBM_T_OTHER 5 /* Other file-types not yet defined */
|
||||
|
||||
/* CBM FILE ACCESS */
|
||||
#define CBM_A_RO 1 /* Read only */
|
||||
#define CBM_A_RW 3 /* Read, Write */
|
||||
|
||||
struct cbm_dirent {
|
||||
char name[17]; /* File name in PETSCII, limited to 16 chars */
|
||||
unsigned int size; /* Size in 256B blocks */
|
||||
unsigned char type;
|
||||
unsigned char access;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Machine info */
|
||||
/*****************************************************************************/
|
||||
|
@ -219,9 +249,23 @@ int __fastcall__ cbm_read (unsigned char lfn, void* buffer, unsigned int size);
|
|||
int __fastcall__ cbm_write (unsigned char lfn, void* buffer, unsigned int size);
|
||||
/* Writes up to "size" bytes from "buffer" to a file.
|
||||
* Returns the number of actually written bytes or -1 in case of an error.
|
||||
* _oserror contains an errorcode then (see table below).
|
||||
* _oserror contains an errorcode then (see above table).
|
||||
*/
|
||||
|
||||
unsigned char __fastcall__ cbm_opendir (unsigned char lfn, unsigned char device);
|
||||
/* Opens directory listing.
|
||||
* Returns 0 if opening directory was successful,
|
||||
* othervise errorcode corresponding to cbm_open()
|
||||
*/
|
||||
|
||||
unsigned char __fastcall__ cbm_readdir (unsigned char lfn, struct cbm_dirent* l_dirent);
|
||||
/* Reads one directory line into cbm_dirent structure.
|
||||
* Returns 0 if reading directory line was successful.
|
||||
* Returns 'true' if reading directory failed or no more files to read.
|
||||
*/
|
||||
|
||||
void __fastcall__ cbm_closedir (unsigned char lfn);
|
||||
/* Closes directory by cbm_close (unsigned char lfn) */
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
cbm_dir.s
|
||||
cbm_load.s
|
||||
cbm_save.s
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
%.o: %.s
|
||||
@$(AS) -g -o $@ $(AFLAGS) $<
|
||||
|
||||
C_OBJS = cbm_load.o \
|
||||
C_OBJS = cbm_dir.o \
|
||||
cbm_load.o \
|
||||
cbm_save.o
|
||||
|
||||
S_OBJS = c_acptr.o \
|
||||
|
|
146
libsrc/cbm/cbm_dir.c
Normal file
146
libsrc/cbm/cbm_dir.c
Normal file
|
@ -0,0 +1,146 @@
|
|||
/* This is very simplified version of POSIX opendir(), readdir() and closedir() */
|
||||
/* for Commodore computers. */
|
||||
/* Created by Josef Soucek, 2003 E-mail:josef.soucek@ct.cz */
|
||||
|
||||
/* Version 0.1 - 21.1.2003 */
|
||||
/* Tested with floppy drive and IDE64 devices */
|
||||
/* Not tested with messed (buggy) directory listing */
|
||||
/* Limits filenames to 16 chars (VICE supports more in directory listing) */
|
||||
|
||||
|
||||
|
||||
#include <cbm.h>
|
||||
|
||||
|
||||
|
||||
unsigned char __fastcall__ cbm_opendir (unsigned char lfn, unsigned char device)
|
||||
{
|
||||
unsigned char status;
|
||||
if ((status = cbm_open (lfn, device, CBM_READ, "$")) == 0) {
|
||||
if (cbm_k_chkin (lfn) == 0) {
|
||||
if (cbm_k_basin () == 0x01) { /* Start address */
|
||||
if (cbm_k_basin () == 0x04) {
|
||||
cbm_k_clrch ();
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
cbm_close (lfn);
|
||||
cbm_k_clrch ();
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned char __fastcall__ cbm_readdir (unsigned char lfn, register struct cbm_dirent* l_dirent)
|
||||
{
|
||||
unsigned char byte, i;
|
||||
|
||||
if (cbm_k_chkin (lfn) == 0) {
|
||||
if (cbm_k_readst () == 0) {
|
||||
cbm_k_basin (); /* 0x01, 0x01, next basic line */
|
||||
cbm_k_basin ();
|
||||
|
||||
byte = cbm_k_basin(); /* File-size */
|
||||
l_dirent->size = byte | ((cbm_k_basin()) << 8);
|
||||
|
||||
byte = cbm_k_basin();
|
||||
|
||||
if (byte == 'b') { /* "B" BLOCKS FREE. */
|
||||
while (cbm_k_readst () == 0) { /* Read until end */
|
||||
cbm_k_basin ();
|
||||
}
|
||||
cbm_k_clrch ();
|
||||
return 2; /* END */
|
||||
}
|
||||
|
||||
if (byte != '\"') {
|
||||
while (cbm_k_basin() != '\"') {
|
||||
if (cbm_k_readst () != 0) { /* ### Included to prevent */
|
||||
cbm_k_clrch (); /* ### Endless loop */
|
||||
return 3; /* ### Should be probably removed */
|
||||
} /* ### */
|
||||
}
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while ((byte = cbm_k_basin ()) != '\"') {
|
||||
if (cbm_k_readst () != 0) { /* ### Included to prevent */
|
||||
cbm_k_clrch (); /* ### Endless loop */
|
||||
return 4; /* ### Should be probably removed */
|
||||
} /* ### */
|
||||
|
||||
if (i < sizeof (l_dirent->name) - 1) {
|
||||
l_dirent->name[i] = byte;
|
||||
++i;
|
||||
}
|
||||
}
|
||||
l_dirent->name[i] = '\0';
|
||||
|
||||
while ((byte=cbm_k_basin ()) == ' ') {
|
||||
if (cbm_k_readst ()) { /* ### Included to prevent */
|
||||
cbm_k_clrch (); /* ### Endless loop */
|
||||
return 5; /* ### Should be probably removed */
|
||||
} /* ### */
|
||||
}
|
||||
|
||||
switch (byte) {
|
||||
case 's':
|
||||
l_dirent->type = CBM_T_SEQ;
|
||||
break;
|
||||
case 'p':
|
||||
l_dirent->type = CBM_T_PRG;
|
||||
break;
|
||||
case 'u':
|
||||
l_dirent->type = CBM_T_USR;
|
||||
break;
|
||||
case 'r':
|
||||
l_dirent->type = CBM_T_REL;
|
||||
break;
|
||||
case 'c':
|
||||
l_dirent->type = CBM_T_CBM;
|
||||
break;
|
||||
case 'd':
|
||||
l_dirent->type = CBM_T_DIR;
|
||||
break;
|
||||
case 'v':
|
||||
l_dirent->type = CBM_T_VRP;
|
||||
break;
|
||||
default:
|
||||
l_dirent->type = CBM_T_OTHER;
|
||||
}
|
||||
|
||||
cbm_k_basin ();
|
||||
cbm_k_basin ();
|
||||
|
||||
byte = cbm_k_basin ();
|
||||
|
||||
l_dirent->access = (byte == 0x3C)? CBM_A_RO : CBM_A_RW;
|
||||
|
||||
if (byte != 0) {
|
||||
while (cbm_k_basin() != 0) {
|
||||
if (cbm_k_readst () != 0) { /* ### Included to prevent */
|
||||
cbm_k_clrch (); /* ### Endless loop */
|
||||
return 6; /* ### Should be probably removed */
|
||||
} /* ### */
|
||||
}
|
||||
}
|
||||
|
||||
cbm_k_clrch ();
|
||||
return 0; /* Line read successfuly */
|
||||
}
|
||||
}
|
||||
cbm_k_clrch ();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void __fastcall__ cbm_closedir( unsigned char lfn)
|
||||
{
|
||||
cbm_close(lfn);
|
||||
}
|
||||
|
||||
|
Loading…
Add table
Reference in a new issue