List of supplied sample programs:
-----------------------------------------------------------------------------
-Name: ascii
+Name: ascii
Description: Shows the ASCII (or ATASCII, PETSCII) codes of typed
characters. Written and contributed by Greg King
<gngking@erols.com>.
-Platforms: All platforms with conio or stdio (compile time configurable).
+Platforms: All platforms with conio or stdio (compile time configurable).
-----------------------------------------------------------------------------
-Name: diodemo
+Name: diodemo
Description: A disc copy program written and contributed by Oliver
Schmidt, <ol.sc@web.de>. Supports single or dual disc copy.
-Platforms: The program does depend on conio and dio (direct disk i/o),
+Platforms: The program does depend on conio and dio (direct disk i/o),
so it does currently compile for the Atari and Apple ][
machines.
-----------------------------------------------------------------------------
-Name: fire
+Name: enumdevdir
+Description: Enumerates all devices, directories and files. Written and
+ contributed by Oliver Schmidt, <ol.sc@web.de>.
+Platforms: All systems with device enumeration and directory access
+ (currently the C64, the C128 and the Apple ][).
+
+-----------------------------------------------------------------------------
+Name: fire
Description: Another graphics demo written by groepaz/hitmen.
-Platforms: The program is currently only running on the C64, but should
+Platforms: The program is currently only running on the C64, but should
be portable to the C128 and CBM510 (and maybe more machines).
-----------------------------------------------------------------------------
-Name: gunzip65
+Name: gunzip65
Description: A gunzip utility for 6502 based machines written by Piotr
Fusik <fox@scene.pl>.
-Platforms: Runs on all platforms with file I/O (currently the Atari, the
+Platforms: Runs on all platforms with file I/O (currently the Atari, the
Apple ][ and most Commodore machines).
-----------------------------------------------------------------------------
-Name: hello
+Name: hello
Description: A nice "Hello world" type program that uses the conio
console I/O library for output.
Platforms: Runs on all platforms that support conio, which means:
Apple ][, Atari, C16, C64, C128, CBM510, CBM610, PET, Plus/4
-----------------------------------------------------------------------------
-Name: mandelbrot
+Name: mandelbrot
Description: A mandelbrot demo using integer arithmetic. The demo was
written by groepaz/hitmen and converted to cc65 using TGI
graphics by Stephan Haubenthal.
Apple ][, C64, C128, Oric Atmos, Geos and Lynx.
-----------------------------------------------------------------------------
-Name: mousedemo
+Name: mousedemo
Description: Shows how to use the mouse.
-Platforms: All systems with mouse and conio support:
+Platforms: All systems with mouse and conio support:
C64, C128, CBM510, Atari, Apple ][
-----------------------------------------------------------------------------
-Name: multidemo
+Name: multidemo
Description: Shows how to combine multiple cc65 features incl. overlays
and extended memory drivers. Written and contributed by
Oliver Schmidt, <ol.sc@web.de>.
-Platforms: All systems with an overlay linker config, disk directory
+Platforms: All systems with an overlay linker config, disk directory
access and EMD support (currently the C64, the C128,
the Atari and the Apple ][).
-----------------------------------------------------------------------------
-Name: nachtm
+Name: nachtm
Description: Plays "Eine kleine Nachtmusik" by Wolfgang Amadeus Mozart
Platforms: All systems that have the Commodore SID (Sound Interface
Device):
C64, C128, CBM510, CBM610
-----------------------------------------------------------------------------
-Name: overlaydemo
+Name: overlaydemo
Description: Shows how to load overlay files from disk. Written and
contributed by Oliver Schmidt, <ol.sc@web.de>.
-Platforms: All systems with an overlay linker config (currently the C64,
+Platforms: All systems with an overlay linker config (currently the C64,
the C128, the Atari and the Apple ][).
-----------------------------------------------------------------------------
-Name: plasma
+Name: plasma
Description: A fancy graphics demo written by groepaz/hitmen.
-Platforms: The program needs a VIC, or a TED, so it runs on the following
+Platforms: The program needs a VIC, or a TED, so it runs on the following
systems:
C64, C128, CBM510, Plus/4
-----------------------------------------------------------------------------
-Name: sieve
+Name: sieve
Description: Implements the "Sieve of Eratosthenes" as a way to find all
prime numbers in a specific number interval. Often used as
a benchmark program.
Apple ][ (without timing due to missing clock support)
-----------------------------------------------------------------------------
-Name: tgidemo
+Name: tgidemo
Description: Shows some of the graphics capabilities of the "tiny graphics
interface".
Platforms: Runs on all platforms that have TGI support:
Apple ][, C64, C128, Oric Atmos, Geos and Lynx.
-
--- /dev/null
+/*
+ * Enumerate devices, directories and files.
+ *
+ * 2012-10-15, Oliver Schmidt (ol.sc@web.de)
+ *
+ */
+
+
+
+#include <stdio.h>
+#include <conio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <device.h>
+#include <dirent.h>
+
+
+void printdir (char *newdir)
+{
+ char olddir[FILENAME_MAX];
+ char curdir[FILENAME_MAX];
+ DIR *dir;
+ struct dirent *ent;
+ char *subdirs = NULL;
+ unsigned dirnum = 0;
+ unsigned num;
+
+ getcwd (olddir, sizeof (olddir));
+ if (chdir (newdir)) {
+
+ /* If chdir() fails we just print the
+ * directory name - as done for files.
+ */
+ printf (" Dir %s\n", newdir);
+ return;
+ }
+
+ /* We call getcwd() in order to print the
+ * absolute pathname for a subdirectory.
+ */
+ getcwd (curdir, sizeof (curdir));
+ printf (" Dir %s:\n", curdir);
+
+ /* Calling opendir() always with "." avoids
+ * fiddling around with pathname separators.
+ */
+ dir = opendir (".");
+ while (ent = readdir (dir)) {
+
+ if (_DE_ISREG (ent->d_type)) {
+ printf (" File %s\n", ent->d_name);
+ continue;
+ }
+
+ /* We defer handling of subdirectories until we're done with the
+ * current one as several targets don't support other disk i/o
+ * while reading a directory (see cc65 readdir() doc for more).
+ */
+ if (_DE_ISDIR (ent->d_type)) {
+ subdirs = realloc (subdirs, FILENAME_MAX * (dirnum + 1));
+ strcpy (subdirs + FILENAME_MAX * dirnum++, ent->d_name);
+ }
+ }
+ closedir (dir);
+
+ for (num = 0; num < dirnum; ++num) {
+ printdir (subdirs + FILENAME_MAX * num);
+ }
+ free (subdirs);
+
+ chdir (olddir);
+}
+
+
+void main (void)
+{
+ unsigned char device;
+ char devicedir[FILENAME_MAX];
+
+ /* Calling getfirstdevice()/getnextdevice() does _not_ turn on the motor
+ * of a drive-type device and does _not_ check for a disk in the drive.
+ */
+ device = getfirstdevice ();
+ while (device != INVALID_DEVICE) {
+ printf ("Device %d:\n", device);
+
+ /* Calling getdevicedir() _does_ check for a (formatted) disk in a
+ * floppy-disk-type device and returns NULL if that check fails.
+ */
+ if (getdevicedir (device, devicedir, sizeof (devicedir))) {
+ printdir (devicedir);
+ } else {
+ printf (" N/A\n");
+ }
+
+ device = getnextdevice (device);
+ }
+
+ cgetc ();
+}