1 /* This is very simplified version of POSIX opendir(), readdir() and closedir() */
2 /* for Commodore computers. */
3 /* Created by Josef Soucek, 2003 E-mail:josef.soucek@ct.cz */
5 /* Version 0.1 - 21.1.2003 */
6 /* Tested with floppy drive and IDE64 devices */
7 /* Not tested with messed (buggy) directory listing */
8 /* Limits filenames to 16 chars (VICE supports more in directory listing) */
16 unsigned char __fastcall__ cbm_opendir (unsigned char lfn, unsigned char device)
19 if ((status = cbm_open (lfn, device, CBM_READ, "$")) == 0) {
20 if (cbm_k_chkin (lfn) == 0) {
21 if (cbm_k_basin () == 0x01) { /* Start address */
22 if (cbm_k_basin () == 0x04) {
38 unsigned char __fastcall__ cbm_readdir (unsigned char lfn, register struct cbm_dirent* l_dirent)
40 unsigned char byte, i;
42 if (cbm_k_chkin (lfn) == 0) {
43 if (cbm_k_readst () == 0) {
44 cbm_k_basin (); /* 0x01, 0x01, next basic line */
47 byte = cbm_k_basin(); /* File-size */
48 l_dirent->size = byte | ((cbm_k_basin()) << 8);
52 if (byte == 'b') { /* "B" BLOCKS FREE. */
53 while (cbm_k_readst () == 0) { /* Read until end */
61 while (cbm_k_basin() != '\"') {
62 if (cbm_k_readst () != 0) { /* ### Included to prevent */
63 cbm_k_clrch (); /* ### Endless loop */
64 return 3; /* ### Should be probably removed */
70 while ((byte = cbm_k_basin ()) != '\"') {
71 if (cbm_k_readst () != 0) { /* ### Included to prevent */
72 cbm_k_clrch (); /* ### Endless loop */
73 return 4; /* ### Should be probably removed */
76 if (i < sizeof (l_dirent->name) - 1) {
77 l_dirent->name[i] = byte;
81 l_dirent->name[i] = '\0';
83 while ((byte=cbm_k_basin ()) == ' ') {
84 if (cbm_k_readst ()) { /* ### Included to prevent */
85 cbm_k_clrch (); /* ### Endless loop */
86 return 5; /* ### Should be probably removed */
92 l_dirent->type = CBM_T_SEQ;
95 l_dirent->type = CBM_T_PRG;
98 l_dirent->type = CBM_T_USR;
101 l_dirent->type = CBM_T_REL;
104 l_dirent->type = CBM_T_CBM;
107 l_dirent->type = CBM_T_DIR;
110 l_dirent->type = CBM_T_VRP;
113 l_dirent->type = CBM_T_OTHER;
119 byte = cbm_k_basin ();
121 l_dirent->access = (byte == 0x3C)? CBM_A_RO : CBM_A_RW;
124 while (cbm_k_basin() != 0) {
125 if (cbm_k_readst () != 0) { /* ### Included to prevent */
126 cbm_k_clrch (); /* ### Endless loop */
127 return 6; /* ### Should be probably removed */
133 return 0; /* Line read successfuly */
141 void __fastcall__ cbm_closedir( unsigned char lfn)