{"id":34970529,"url":"https://github.com/howerj/ffs","last_synced_at":"2026-03-15T08:49:51.665Z","repository":{"id":231606017,"uuid":"782153870","full_name":"howerj/ffs","owner":"howerj","description":"Forth File System using the BLOCK word-set","archived":false,"fork":false,"pushed_at":"2025-11-19T22:57:23.000Z","size":1057,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-20T00:22:28.952Z","etag":null,"topics":["block","blocks","dos","file-system","forth","ms-dos-style","simple","subleq"],"latest_commit_sha":null,"homepage":"","language":"Forth","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"0bsd","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/howerj.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-04-04T18:33:41.000Z","updated_at":"2025-11-19T22:57:27.000Z","dependencies_parsed_at":"2024-04-15T00:22:06.516Z","dependency_job_id":"f77952dc-cc7f-4dea-ae51-13c52fbd0463","html_url":"https://github.com/howerj/ffs","commit_stats":null,"previous_names":["howerj/ffs"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/howerj/ffs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howerj%2Fffs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howerj%2Fffs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howerj%2Fffs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howerj%2Fffs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/howerj","download_url":"https://codeload.github.com/howerj/ffs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/howerj%2Fffs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30539324,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-15T07:17:37.589Z","status":"ssl_error","status_checked_at":"2026-03-15T07:17:31.738Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["block","blocks","dos","file-system","forth","ms-dos-style","simple","subleq"],"created_at":"2025-12-26T23:44:30.160Z","updated_at":"2026-03-15T08:49:51.659Z","avatar_url":"https://github.com/howerj.png","language":"Forth","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Simple Forth File System based upon the BLOCK word-set\n\n* Author: Richard James Howe\n* Email: \u003cmailto:howe.r.j.89@gmail.com\u003e\n* License: 0BSD / Public Domain\n* Repo: \u003chttps://github.com/howerj/ffs\u003e\n\nThis is a simple Forth block based file system. See the Forth\nfile [ffs.fth][] for more information including documentation. \n\nThe file system provides a word-set that allows a user to\ninteract with a disk image like you would with a\n[DOS][] based system.\n\nThis project works under \u003chttps://gforth.org/\u003e and also \nSUBLEQ eForth (see \u003chttps://github.com/howerj/subleq\u003e).\n\nSome quick notes and limitations:\n\n* Files consist of *non-contiguous* Forth Blocks.\n* Files still consist of Forth Blocks, so are multiples of\n1024 bytes in size on disk (for example, if a file is a 100 bytes, \none block is used, if it is 1200 bytes, 2 blocks will be used).\n* The maximum file system size is roughly 64MiB.\n* The maximum number of files per directory is 31.\n* Command lines are limited to 128 bytes, try to keep them below\n80 chars however.\n* The file system is reliant on the Forth Block word-set and \nshould run on even the most spartan Forth system so long as it \nis present.\n* File names are limited to 16 bytes in size.\n* Some commands include; `edit`, `exe`, `ls`, `rm`, `rmdir`, \n`mkdir`, `cd`, `pwd`, `tree`, `cp`, `rename`, `cat`, `hexdump`, \n`more`, `df`, `halt`, `fdisk`, and `stat`.\n* Full file path parsing is not available and most commands\noperate only using the current working directory. For example \nyou cannot `rm a/b/c`, you would need to `cd a`, `cd b` and \nthen call `rm c`. This is not a limitation of the file system\nbut the tools built upon it. Some utilities can parse \".\" for\nthe current directory and \"..\" for the next directory up such\nas \"mv\" and \"cd\" but most cannot.\n* The file system is designed to run as a single user system,\nthere is no locking and global variables are used.\n* Only one file system can be mounted at a time.\n* Some commands are line oriented, others have block oriented\nanalogues such as \"cat\" (line oriented) and \"bcat\" (block\noriented). The block oriented utilities expect the files\ngiven to them to formatted as a Forth Block would be.\n* There is no redundant FAT block data structure like in \nFAT-12/FAT-16/FAT-32.\n* Low memory usage: The file system uses kilobytes of data\n(and can be further reduced if features like editing are not\nrequired). A handful of variables and buffers are used, along\nwith the Forth Block system (a Block System with a single buffer\nwould work).\n* For a list of bugs or to-dos, search for the strings BUG and\nTODO, this is a small project and whilst care has been taken\nin programming it there are bound to be errors, errors which are\nworked out with usage of the system. I would not yet trust it to\nstore data without loss, yet.\n\n## Examples\n\nThe following section contains a few examples of how to use\nthe file system and associated commands. To run the SUBLEQ\neForth examples you will need [make][] and a [C compiler][]\ninstalled and on your [PATH][].\n\n### GForth\n\nAn example session:\n\n\tmkdir example\n\tcd example\n\tpwd\n\tedit test.fth \\ Start editor commands\n\t+ .( FIRST BLOCK ) cr\n        + .( FIRST BLOCK, SECOND LINE ) cr\n\tn\n\t+ .( SECOND BLOCK ) cr\n\ts\n\tq     \\ Back to \"DOS\"\n\tls\n\texe test.fth\n\tdf\n\trm test.fth\n\tls\n\n### SUBLEQ eForth\n\nTo run the SUBLEQ eForth system you will need to type:\n\n\tmake disk\n\nThis will make a bootable disk image that will work with\nthe SUBLEQ VM. It will take a while to do so.\n\nInstead of saving to a file called `ffs.fb` the disk image\n`disk.dec` will be updated after exiting from the SUBLEQ\nVM cleanly.\n\nThe SUBLEQ VM File System can only allocate from a pool of\nabout 61 blocks, there are special files that are created,\nsuch as `[KERNEL]` that allow file system access to the SUBLEQ \neForth image.\n\n## Example Sessions\n\nAn example session recorded with [ttyrec][] (all shorter than \nthey should be because of problems converting the recording\nto a GIF):\n\n![Example Session 1](1.gif \"Session 1\")\n\nAnd another:\n\n![Example Session 2](2.gif \"Session 2\")\n\nAnd another:\n\n![Example Session 3](3.gif \"Session 3\")\n\n## References\n\n* \u003chttps://github.com/howerj/subleq\u003e\n* \u003chttps://en.wikipedia.org/wiki/File_Allocation_Table\u003e\n\n[ffs.fth]: ffs.fth\n[DOS]: https://en.wikipedia.org/wiki/DOS\n[make]: https://www.gnu.org/software/make/\n[C Compiler]: https://gcc.gnu.org/\n[PATH]: https://en.wikipedia.org/wiki/PATH_(variable)\n[ttyrec]: https://en.wikipedia.org/wiki/Ttyrec\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowerj%2Fffs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhowerj%2Fffs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowerj%2Fffs/lists"}