From abbf6ac5cb00ec5fbb702b227f7706fc4cac3a92 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 4 Sep 2026 09:07:06 +0200 Subject: [PATCH 01/14] docs: distribution and changelog polish ptable.library is no longer tagged optional in CONTENTS: there is no partition parser left in the driver, so without it compactflash.device is a plain mount-only device. List c/lsptres and the automount and lsptres guides, which ship but were missing from CONTENTS. Give WHAT'S NEW one heading per component, naming the component and version it covers, and fold the automount keys back into the single Automount entry: they are parts of one feature, described in automount.guide. Correct the guide's claim that automount needs compactflash.automount, and the cold-boot delay in the readme. Reflow the comments in the shipped ENVARC/cfd.prefs example. --- Makefile | 2 +- README.md | 1 + dist.readme.in | 46 ++++++++++++++++++++------------- dist/ENVARC/cfd.prefs | 23 +++++++++-------- dist/docs/automount.guide | 48 ++++++++++++++++++---------------- dist/docs/cfd.guide | 4 ++- dist/docs/changes.guide | 54 ++++++++++++++++----------------------- docs/automount.md | 12 +++++---- docs/changes.md | 17 +++++------- 9 files changed, 107 insertions(+), 100 deletions(-) diff --git a/Makefile b/Makefile index b522c14..cfa1781 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # Release version: YYYYMMDD package date + optional in-progress suffix # (-dev, -rc1, ...). Empty suffix for a final release. -RELEASE_DATE = 20260827 +RELEASE_DATE = 20260904 VERSION_SUFFIX = -dev # compactflash.device version diff --git a/README.md b/README.md index 7a27c93..9321224 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ See [docs/changes.md](docs/changes.md) for release news and history. * Amiga 1200 or 600 (A1200 tested) * AmigaOS 2.0+ (tested with 3.2.3) * CF-to-PCMCIA adapter or SD-to-CF adapter (see [Hardware Notes](#hardware-notes)) +* `ptable.library` (bundled) in `LIBS:` or in ROM: does all partition scanning and mounting * Works with fat95 filesystem for FAT32 support (disk/misc/fat95.lha) or native (FFS, SFS, PFS) filesystems if RDB partition table is used ## Installation diff --git a/dist.readme.in b/dist.readme.in index fc2819c..1999706 100644 --- a/dist.readme.in +++ b/dist.readme.in @@ -14,26 +14,32 @@ COMPONENTS IN THIS RELEASE ========================== @COMPONENT_VERSIONS@ -CHANGES IN @DATE@ -===================== +WHAT'S NEW (@DATE@) +======================= -compactflash.device: +New major version of compactflash.device 2.0 driver: -* Automount: hotplugged cards mount automatically at DOS time (on by - default; disable with AUTOMOUNT 0 in the new ENV:cfd.prefs config - file). Removing a card unmounts all supported filesystems by default. - Boot and automount bringup is split into a separate - compactflash.automount module. See automount.guide. +* Automount: hotplugged cards mount automatically at DOS time, on by + default. Can be disabled with AUTOMOUNT 0 in the new ENV:cfd.prefs + config file. Removing a card fully unmounts all supported filesystems + by default (UNMOUNT restricts it, UNMOUNT NONE keeps the + handlers). Boot and automount bringup is split into a separate + compactflash.automount module. Cold boot registers the RDB partitions + (the autoboot chain); MBR, GPT and flat partitions are mounted by the + automount agent once DOS is up, so cfd.prefs applies to them on a + ROM-resident system too. See automount.guide for the full reference; + automount-review.guide walks the feature scenario by scenario with + the expected result of each. -ptable.library: +New major version of ptable.library 2.0 (bundled): -* Unified partition scanning: one scanner parses RDB, MBR, GPT, and - whole-disk FAT and publishes every partition into a shared - partition.resource, now used by both compactflash.device and fat95 - instead of each carrying its own. The new lsptres tool lists the - resource. Library: https://github.com/pulchart/amigaos-ptable +* Unified partition scanning: a shared partition-table library the + driver now uses instead of its own parser. It scans RDB, MBR, GPT and + flat (whole-disk) partition tables and publishes every partition into + a shared partition.resource. The new lsptres tool lists the resource + (https://github.com/pulchart/amigaos-ptable). -pcmciacheck: +Tools 'pcmciacheck 2.0': * New "-identify" read-stability test: reads the same sector several times per mode and reports STABLE, UNSTABLE or STUCK. A card that @@ -156,8 +162,9 @@ recognise exactly five filesystem names and no others: DOS, FFS, SFS, PFS, FAT. Any other name is silently ignored. FAT partitions still need fat95 loaded so its filesystem code is -registered. On cold boot the driver tolerates slow cards by polling for -up to ~1.8s; with a stable card the delay is zero. +registered. At cold boot an empty slot is detected by a single Gayle +read and costs nothing; with a card present the boot stub polls up to +5 s for a slow one. More details are in automount.guide. @@ -341,7 +348,7 @@ cfd/small/68020/devs/compactflash.device - 68020+, no debug code cfd/full/68000/devs/compactflash.device - 68000+, debug-capable (serial output with Flags=8) cfd/small/68000/devs/compactflash.device - 68000+, no debug code -ptable.library (optional) - partition scanner/automounter (RDB/MBR/GPT/FAT): +ptable.library (required) - partition scanner/automounter (RDB/MBR/GPT/FAT): cfd/full/68020/libs/ptable.library - 68020+, debug-capable (serial output always on at boot) cfd/small/68020/libs/ptable.library - 68020+, no debug code cfd/full/68000/libs/ptable.library - 68000+, debug-capable (serial output always on at boot) @@ -357,15 +364,18 @@ cfd/small/68000/libs/compactflash.automount - no debug code cfd/c/CFInfo - Card information utility (displays model, size, capabilities) cfd/c/pcmciacheck - PCMCIA check utility cfd/c/pcmciaspeed - Speed test utility +cfd/c/lsptres - partition.resource entry lister (from ptable.library) cfd/Storage/DOSDrivers/CF0 - Mountlist entry (with flags documentation) cfd/Storage/DOSDrivers/CF0.info - Mountlist Workbench icon cfd/ENVARC/cfd.prefs - Example config (copy to ENVARC:cfd.prefs to automount) cfd/docs/cfd.guide - Main documentation +cfd/docs/automount.guide - Autoboot, automount, and ENV:cfd.prefs configuration cfd/docs/automount-review.guide - Automount feature review (expected behaviour) cfd/docs/changes.guide - Release notes and original CFD history cfd/docs/CFInfo.guide - CFInfo utility documentation +cfd/docs/lsptres.guide - lsptres utility documentation cfd/docs/pcmciacheck.guide - pcmciacheck utility documentation cfd/docs/pcmciaspeed.guide - pcmciaspeed utility documentation diff --git a/dist/ENVARC/cfd.prefs b/dist/ENVARC/cfd.prefs index 796987b..e58be60 100644 --- a/dist/ENVARC/cfd.prefs +++ b/dist/ENVARC/cfd.prefs @@ -1,13 +1,16 @@ -; compactflash.device config. copy to ENVARC:cfd.prefs (see automount.guide). +; compactflash.device config. copy to ENVARC:cfd.prefs AUTOMOUNT 1 FLAGS 0 CONTROL_FAT -d-D+q -; Mount FAT cards with CrossDOS instead of fat95 (both lines needed): -; DOSTYPE_FAT 0x4D534400 -; HANDLER_FAT L:CrossDOSFileSystem -; Hand-mounted (DEVS:DOSDrivers) partitions are unmounted on card removal -; like everything else. Set 0 to keep their handler mounted instead: -; UNMOUNT_STATIC 0 -; A hand mount over an already-served partition is refused (object in use). -; Set 1 to allow it anyway; writes then corrupt the volume, your own risk: -; MOUNT_USED 1 + +; Mount FAT cards with CrossDOS instead of fat95: +;DOSTYPE_FAT 0x4D534400 +;HANDLER_FAT L:CrossDOSFileSystem + +; Static mounts (DEVS:DOSDrivers) are unmounted on card removal. +; Set 0 to keep their handler mounted instead: +;UNMOUNT_STATIC 0 + +; A static mount over an already-automounted partition is refused +; (object in use). Set 1 to allow it anyway. +;MOUNT_USED 1 diff --git a/dist/docs/automount.guide b/dist/docs/automount.guide index e690073..39f7620 100644 --- a/dist/docs/automount.guide +++ b/dist/docs/automount.guide @@ -50,13 +50,13 @@ they go away again. With the driver in a Kickstart ROM you can also boot straight off the card. This guide covers both, and the @{fg shine}ENV:cfd.prefs@{fg text} file that configures them. -The scanning and mounting itself is done by @{fg shine}ptable.library@{fg text} , which is -required for all of it. Without that library @{fg shine}compactflash.device@{fg text} still -works, but as a plain mount-only device: you mount partitions yourself -through @{fg shine}DEVS:DOSDrivers/@{fg text} . See @{fg shine}ptable.guide@{fg text} (shipped with the -ptable.library archive) for the library internals. The expected -behaviour of the whole feature is catalogued scenario by scenario in -@{fg shine}automount-review.guide@{fg text} ( @{" automount-review.guide " link "automount-review.guide/Main"} ). +@{fg shine}ptable.library@{fg text} does the scanning and mounting, and is required for all +of it. Without that library @{fg shine}compactflash.device@{fg text} still works, but as a +plain mount-only device: you mount partitions yourself through +@{fg shine}DEVS:DOSDrivers/@{fg text} . See @{fg shine}ptable.guide@{fg text} (shipped with the ptable.library +archive) for the library internals. The expected behaviour of the whole +feature is catalogued scenario by scenario in @{fg shine}automount-review.guide@{fg text} ( @{" automount-review.guide " link "automount-review.guide/Main"} +). ---------------------------------------- @{"<< Prev" link Main} @{"Contents" link Main} @{"Next >>" link Quick_start} @@ -66,25 +66,29 @@ behaviour of the whole feature is catalogued scenario by scenario in @node Quick_start "Quick start" @{b}Quick start@{ub} -Three modules are involved, and automount is opt-in by whether you -include the third: +Three modules are involved: * @{fg shine}compactflash.device@{fg text}: the I/O driver. * @{fg shine}ptable.library@{fg text} : the partition scanner and automounter (RDB, MBR, GPT, flat FAT). - * @{fg shine}compactflash.automount@{fg text} : boot and automount bringup. Include it only when you - want autoboot or automount. - - @{b}Goal@{ub} @{b}Modules@{ub} @{b}Cold-boot autoboot@{ub} - -------------------- ------------------------ ------------------ - ROM autoboot @{fg shine}compactflash.device@{fg text} + available - @{fg shine}compactflash.automount@{fg text} + - @{fg shine}ptable.library@{fg text} in - Kickstart - Resident/on-disk, no @{fg shine}compactflash.device@{fg text} + no - automount @{fg shine}ptable.library@{fg text} (no - automount module) - On-disk automount @{fg shine}LoadModule@{fg text} line below no + * @{fg shine}compactflash.automount@{fg text} : bringup. It opens the device after DOS, and in a ROM + it also carries the cold-boot autoboot stub. + +Automount needs the device open, because the agent lives in the unit +task. Anything that opens it will do, a @{fg shine}DEVS:DOSDrivers/CF0@{fg text} mount +included; @{fg shine}compactflash.automount@{fg text} is how you get it open without a +mountlist entry, and the only way to get cold-boot autoboot. + + @{b}Goal@{ub} @{b}Modules@{ub} @{b}Cold-boot autoboot@{ub} + ------------------------- ------------------------ ------------------ + ROM autoboot @{fg shine}compactflash.device@{fg text} + available + @{fg shine}compactflash.automount@{fg text} + + @{fg shine}ptable.library@{fg text} in + Kickstart + On-disk, device opened by @{fg shine}compactflash.device@{fg text} + no + a @{fg shine}DOSDrivers@{fg text} mount @{fg shine}ptable.library@{fg text} + On-disk, no mountlist @{fg shine}LoadModule@{fg text} line below no + entry For a disk install, put @{fg shine}compactflash.automount@{fg text} and @{fg shine}ptable.library@{fg text} in @{fg shine}LIBS:@{fg text} and add this to your @{fg shine}user-startup@{fg text} : diff --git a/dist/docs/cfd.guide b/dist/docs/cfd.guide index f80c46b..d4c310c 100644 --- a/dist/docs/cfd.guide +++ b/dist/docs/cfd.guide @@ -1,5 +1,5 @@ @database "compactflash.device" -@$VER: compactflash.device guide 2.0-dev (25.08.2026) +@$VER: compactflash.device guide 2.0-dev (27.08.2026) @author "Generated by md2guide.py v1.6 (14.06.2026)" @(c) "See LICENSE" @font topaz.font 8 @@ -185,6 +185,8 @@ See @{" docs/changes.guide " link "changes.guide/Main"} for release news and h * Amiga 1200 or 600 (A1200 tested) * AmigaOS 2.0+ (tested with 3.2.3) * CF-to-PCMCIA adapter or SD-to-CF adapter (see @{"Hardware Notes" link hardware_notes}) + * @{fg shine}ptable.library@{fg text} (bundled) in @{fg shine}LIBS:@{fg text} or in ROM: does all partition scanning and + mounting * Works with fat95 filesystem for FAT32 support (disk/misc/fat95.lha) or native (FFS, SFS, PFS) filesystems if RDB partition table is used diff --git a/dist/docs/changes.guide b/dist/docs/changes.guide index 7c01a5e..846c381 100644 --- a/dist/docs/changes.guide +++ b/dist/docs/changes.guide @@ -1,5 +1,5 @@ @database "compactflash.device release notes" -@$VER: compactflash.device release notes guide 20260827-dev (27.08.2026) +@$VER: compactflash.device release notes guide 20260904-dev (04.09.2026) @author "Generated by md2guide.py v1.6 (14.06.2026)" @(c) "See LICENSE" @font topaz.font 8 @@ -10,7 +10,7 @@ @{b}compactflash.device release notes@{ub} - @{"20260827-dev" link 20260827_dev} + @{"20260904-dev" link 20260904_dev} @{"20260614" link 20260614} @{"20260609" link 20260609} @{"v1.43 (19.05.2026)" link v1_43__19_05_2026_} @@ -32,7 +32,7 @@ @{"20260609" link 20260609} @{"20260614" link 20260614} - @{"20260827-dev" link 20260827_dev} + @{"20260904-dev" link 20260904_dev} @{b}O@{ub} @{"Original CFD History Through v1.33" link Original_CFD_History_Through_v1_33} @{b}V@{ub} @@ -49,8 +49,8 @@ @endnode -@node 20260827_dev "20260827-dev" -@{b}20260827-dev@{ub} +@node 20260904_dev "20260904-dev" +@{b}20260904-dev@{ub} @{i}Components in this release@{ui}: @@ -62,34 +62,27 @@ * @{fg shine}pcmciacheck 2.0 (06.08.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}lsptres 1.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} -@{b}CompactFlash Driver@{ub} +@{b}New major version of compactflash.device 2.0 driver@{ub} - * @{b}Automount.@{ub} Hotplugged cards mount automatically at DOS time, on by default; - disable with @{fg shine}AUTOMOUNT 0@{fg text} in the new @{fg shine}ENV:cfd.prefs@{fg text} config file. Removing a card - fully unmounts all supported filesystems by default ( @{fg shine}UNMOUNT @{fg text} - restricts it, @{fg shine}UNMOUNT NONE@{fg text} keeps the handlers). Boot and automount bringup is - split into a separate @{fg shine}compactflash.automount@{fg text} module. Cold boot registers the - RDB partitions (the autoboot chain); MBR, GPT and flat partitions are mounted - by the automount agent once DOS is up, so @{fg shine}cfd.prefs@{fg text} applies to them on a - ROM-resident system too. See @{" automount.guide " link "automount.guide/Main"} . - * @{b}The FAT filesystem is selectable.@{ub} @{fg shine}DOSTYPE_FAT 0x4D534400@{fg text} with - @{fg shine}HANDLER_FAT L:CrossDOSFileSystem@{fg text} in @{fg shine}cfd.prefs@{fg text} mounts FAT cards with CrossDOS - instead of fat95; @{fg shine}HANDLER_FAT L:fat95@{fg text} alone loads fat95 from disk when it is - not resident. See @{" automount.guide " link "automount.guide/Main"} . + * @{b}Automount.@{ub} Hotplugged cards mount automatically at DOS time, on by default. + Can be disabled with @{fg shine}AUTOMOUNT 0@{fg text} in the new @{fg shine}ENV:cfd.prefs@{fg text} config file. + Removing a card fully unmounts all supported filesystems by default ( + @{fg shine}UNMOUNT @{fg text} restricts it, @{fg shine}UNMOUNT NONE@{fg text} keeps the handlers). Boot and + automount bringup is split into a separate @{fg shine}compactflash.automount@{fg text} module. Cold + boot registers the RDB partitions (the autoboot chain); MBR, GPT and flat + partitions are mounted by the automount agent once DOS is up, so @{fg shine}cfd.prefs@{fg text} + applies to them on a ROM-resident system too. See @{" automount.guide " link "automount.guide/Main"} for the full reference; @{" automount-review.guide " link "automount-review.guide/Main"} + walks the feature scenario by scenario with the expected result of each. -@{b}Partition Table library@{ub} +@{b}New major version of ptable.library 2.0 (bundled)@{ub} - * @{b}Unified partition scanning.@{ub} One scanner parses RDB, MBR, GPT, and flat - (whole-disk) partition tables and publishes every partition into a shared - @{fg shine}partition.resource@{fg text} , now used by both @{fg shine}compactflash.device@{fg text} and @{fg shine}fat95@{fg text} instead of - each carrying its own. The new @{fg shine}lsptres@{fg text} tool lists the resource. See @{" ptable.guide " link "ptable.guide/Main"} and @{" lsptres.guide " link "lsptres.guide/Main"} . - * @{b}Selectable filesystem for MBR/GPT FAT partitions@{ub} , driven by the @{fg shine}DOSTYPE_FAT@{fg text} - and @{fg shine}HANDLER_FAT@{fg text} keys above. @{fg shine}lsptres@{fg text} shows the DosType a partition is mounted - with. + * @{b}Unified partition scanning.@{ub} A shared partition-table library the driver now + uses instead of its own parser. It scans RDB, MBR, GPT and flat (whole-disk) + partition tables and publishes every partition into a shared + @{fg shine}partition.resource@{fg text} . The new @{fg shine}lsptres@{fg text} tool lists the resource. See @{" ptable.guide " link "ptable.guide/Main"} and @{" lsptres.guide " link "lsptres.guide/Main"} . -@{b}Tools@{ub} +@{b}Tools 'pcmciacheck 2.0'@{ub} -@{i}pcmciacheck 2.0@{ui} * @{b}New @{fg shine}-identify@{fg text} read-stability test.@{ub} (#67 (https://github.com/pulchart/cfd/issues/67)) Reads the same sector several times per mode and reports @{fg shine}STABLE@{fg text} , @{fg shine}UNSTABLE@{fg text} or @{fg shine}STUCK@{fg text} . A card that returns @@ -107,9 +100,6 @@ attached to a bug report. Restored on exit, and a diagnostic only: the driver programs that register itself. - * @{b}The read and write mode tests follow the driver more accurately@{ub} , and @{fg shine}-cis@{fg text} now - reports the real access speed of cards that use the extended encoding. See @{" pcmciacheck.guide " link "pcmciacheck.guide/Main"} . - ---------------------------------------- @{"<< Prev" link Main} @{"Contents" link Main} @{"Next >>" link 20260614} @@ -132,7 +122,7 @@ Documentation-only update (no binaries changed). Release notes and original CFD history are included in @{" docs/changes.guide " link "changes.guide/Main"} document. ---------------------------------------- -@{"<< Prev" link 20260827_dev} @{"Contents" link Main} @{"Next >>" link 20260609} +@{"<< Prev" link 20260904_dev} @{"Contents" link Main} @{"Next >>" link 20260609} @endnode diff --git a/docs/automount.md b/docs/automount.md index 3f8d8af..a1dfc5d 100644 --- a/docs/automount.md +++ b/docs/automount.md @@ -2,21 +2,23 @@ Insert a CF card and its partitions mount by themselves; pull it and they go away again. With the driver in a Kickstart ROM you can also boot straight off the card. This guide covers both, and the `ENV:cfd.prefs` file that configures them. -The scanning and mounting itself is done by `ptable.library`, which is required for all of it. Without that library `compactflash.device` still works, but as a plain mount-only device: you mount partitions yourself through `DEVS:DOSDrivers/`. See `ptable.guide` (shipped with the ptable.library archive) for the library internals. The expected behaviour of the whole feature is catalogued scenario by scenario in `automount-review.guide` ([automount-review.md](automount-review.md)). +`ptable.library` does the scanning and mounting, and is required for all of it. Without that library `compactflash.device` still works, but as a plain mount-only device: you mount partitions yourself through `DEVS:DOSDrivers/`. See `ptable.guide` (shipped with the ptable.library archive) for the library internals. The expected behaviour of the whole feature is catalogued scenario by scenario in `automount-review.guide` ([automount-review.md](automount-review.md)). ## Quick start -Three modules are involved, and automount is opt-in by whether you include the third: +Three modules are involved: - `compactflash.device`: the I/O driver. - `ptable.library`: the partition scanner and automounter (RDB, MBR, GPT, flat FAT). -- `compactflash.automount`: boot and automount bringup. Include it only when you want autoboot or automount. +- `compactflash.automount`: bringup. It opens the device after DOS, and in a ROM it also carries the cold-boot autoboot stub. + +Automount needs the device open, because the agent lives in the unit task. Anything that opens it will do, a `DEVS:DOSDrivers/CF0` mount included; `compactflash.automount` is how you get it open without a mountlist entry, and the only way to get cold-boot autoboot. | Goal | Modules | Cold-boot autoboot | |---|---|---| | ROM autoboot | `compactflash.device` + `compactflash.automount` + `ptable.library` in Kickstart | available | -| Resident/on-disk, no automount | `compactflash.device` + `ptable.library` (no automount module) | no | -| On-disk automount | `LoadModule` line below | no | +| On-disk, device opened by a `DOSDrivers` mount | `compactflash.device` + `ptable.library` | no | +| On-disk, no mountlist entry | `LoadModule` line below | no | For a disk install, put `compactflash.automount` and `ptable.library` in `LIBS:` and add this to your `user-startup`: diff --git a/docs/changes.md b/docs/changes.md index 789ad6f..b0da68f 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,4 +1,4 @@ -## 20260827-dev +## 20260904-dev _Components in this release_: @@ -12,25 +12,20 @@ _Components in this release_: - `lsptres 1.0-dev (27.08.2026)` _(new)_ -##### CompactFlash Driver +#### New major version of compactflash.device 2.0 driver -- **Automount.** Hotplugged cards mount automatically at DOS time, on by default; disable with `AUTOMOUNT 0` in the new `ENV:cfd.prefs` config file. Removing a card fully unmounts all supported filesystems by default (`UNMOUNT ` restricts it, `UNMOUNT NONE` keeps the handlers). Boot and automount bringup is split into a separate `compactflash.automount` module. Cold boot registers the RDB partitions (the autoboot chain); MBR, GPT and flat partitions are mounted by the automount agent once DOS is up, so `cfd.prefs` applies to them on a ROM-resident system too. See [automount.md](automount.md). -- **The FAT filesystem is selectable.** `DOSTYPE_FAT 0x4D534400` with `HANDLER_FAT L:CrossDOSFileSystem` in `cfd.prefs` mounts FAT cards with CrossDOS instead of fat95; `HANDLER_FAT L:fat95` alone loads fat95 from disk when it is not resident. See [automount.md](automount.md). +- **Automount.** Hotplugged cards mount automatically at DOS time, on by default. Can be disabled with `AUTOMOUNT 0` in the new `ENV:cfd.prefs` config file. Removing a card fully unmounts all supported filesystems by default (`UNMOUNT ` restricts it, `UNMOUNT NONE` keeps the handlers). Boot and automount bringup is split into a separate `compactflash.automount` module. Cold boot registers the RDB partitions (the autoboot chain); MBR, GPT and flat partitions are mounted by the automount agent once DOS is up, so `cfd.prefs` applies to them on a ROM-resident system too. See [automount.md](automount.md) for the full reference; [automount-review.md](automount-review.md) walks the feature scenario by scenario with the expected result of each. -##### Partition Table library +#### New major version of ptable.library 2.0 (bundled) -- **Unified partition scanning.** One scanner parses RDB, MBR, GPT, and flat (whole-disk) partition tables and publishes every partition into a shared `partition.resource`, now used by both `compactflash.device` and `fat95` instead of each carrying its own. The new `lsptres` tool lists the resource. See [ptable.md](https://github.com/pulchart/amigaos-ptable/blob/HEAD/docs/ptable.md) and [lsptres.md](https://github.com/pulchart/amigaos-ptable/blob/HEAD/docs/lsptres.md). -- **Selectable filesystem for MBR/GPT FAT partitions**, driven by the `DOSTYPE_FAT` and `HANDLER_FAT` keys above. `lsptres` shows the DosType a partition is mounted with. +- **Unified partition scanning.** A shared partition-table library the driver now uses instead of its own parser. It scans RDB, MBR, GPT and flat (whole-disk) partition tables and publishes every partition into a shared `partition.resource`. The new `lsptres` tool lists the resource. See [ptable.md](https://github.com/pulchart/amigaos-ptable/blob/HEAD/docs/ptable.md) and [lsptres.md](https://github.com/pulchart/amigaos-ptable/blob/HEAD/docs/lsptres.md). -##### Tools +#### Tools 'pcmciacheck 2.0' -*pcmciacheck 2.0* - **New `-identify` read-stability test.** ([#67](https://github.com/pulchart/cfd/issues/67)) Reads the same sector several times per mode and reports `STABLE`, `UNSTABLE` or `STUCK`. A card that returns different bytes on each read, or the same word over and over, corrupts files, and that is why the driver refuses it with `FAILED (data mismatch)` or `FAILED (repeated pattern)`. Only the mode the driver actually uses decides the verdict. `-r ` sets the number of runs (default 5). Console only, no log file, like `-cis`. - **A Gayle PCMCIA timing can be given** (`100`, `150`, `250`, `720`): `-s ` for the normal run, `pcmciacheck -identify ` for the stability test. Both accept `all`: `-identify all` prints a verdict matrix so you can see whether a card only misbehaves at the faster timings, and `-s all` repeats the capture at every timing and logs all of them, so the raw data behind such a fault can be attached to a bug report. Restored on exit, and a diagnostic only: the driver programs that register itself. -- **The read and write mode tests follow the driver more accurately**, and `-cis` now reports the real access speed of cards that use the extended encoding. See [pcmciacheck.md](pcmciacheck.md). - ## 20260614 _Components in this release_: From 137f84bbf41b30f5802b7a0a589d009f78ff1ad9 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 07:43:43 +0200 Subject: [PATCH 02/14] Share ATAPI read and write packet setup --- src/cfd.s | 66 +++++++++++++++++++++++-------------------------------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/src/cfd.s b/src/cfd.s index 3315942..05a4289 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -5361,6 +5361,32 @@ _gid_end: movem.l (sp)+,d2-d6/a2 rts + ifd ATAPI +; In: a2 = buffer, d2 = LBA, d4 = block count, a3 = unit. +; Out: a0 = SCSI structure for _Packet. Clobbers d0/a1. +INIT_SCSI_RW macro + lea CFU_SCSIStruct(a3),a0 + move.l a2,(a0)+ ;SCSI_Data + move.l d4,d0 + lsl.l #8,d0 + add.l d0,d0 ;*2 via add.l (faster than lsl.l #1) + move.l d0,(a0)+ ;SCSI_Length + clr.l (a0)+ ;SCSI_Actual + lea CFU_Packet(a3),a1 + move.l a1,(a0)+ ;SCSI_Command + moveq.l #10,d0 + swap d0 + move.l d0,(a0)+ ;SCSI_CmdLength, _CmdActual + move.w #\1<<8,(a0) ;SCSI_Flags, _Status + move.w #\2<<8,(a1)+ + move.l d2,(a1)+ + move.l d4,d0 + lsl.l #8,d0 + move.l d0,(a1) + lea CFU_SCSIStruct(a3),a0 + endm + endc + ;--- read Blocks ------------------------------------------- ; Read sectors from CF card using PIO ; @@ -5541,25 +5567,7 @@ _rb_scsi: move.l d3,d4 _rb_s1: - lea CFU_SCSIStruct(a3),a0 - move.l a2,(a0)+ ;SCSI_Data - move.l d4,d0 - lsl.l #8,d0 - add.l d0,d0 ;*2 via add.l (faster than lsl.l #1) - move.l d0,(a0)+ ;SCSI_Length - clr.l (a0)+ ;SCSI_Actual - lea CFU_Packet(a3),a1 - move.l a1,(a0)+ ;SCSI_Command - moveq.l #10,d0 - swap d0 - move.l d0,(a0)+ ;SCSI_CmdLength, _CmdActual - move.w #SCSIF_READ<<8,(a0) ;SCSI_Flags, _Status - move.w #READ10<<8,(a1)+ - move.l d2,(a1)+ - move.l d4,d0 - lsl.l #8,d0 - move.l d0,(a1) - lea CFU_SCSIStruct(a3),a0 + INIT_SCSI_RW SCSIF_READ,READ10 bsr _Packet tst.b d0 bne.s _rb_serror @@ -6241,25 +6249,7 @@ _wb_scsi: move.l d3,d4 _wb_s1: - lea CFU_SCSIStruct(a3),a0 - move.l a2,(a0)+ ;SCSI_Data - move.l d4,d0 - lsl.l #8,d0 - add.l d0,d0 ;*2 via add.l (faster than lsl.l #1) - move.l d0,(a0)+ ;SCSI_Length - clr.l (a0)+ ;SCSI_Actual - lea CFU_Packet(a3),a1 - move.l a1,(a0)+ ;SCSI_Command - moveq.l #10,d0 - swap d0 - move.l d0,(a0)+ ;SCSI_CmdLength, _CmdActual - move.w #SCSIF_WRITE<<8,(a0) ;SCSI_Flags, _Status - move.w #WRITE10<<8,(a1)+ - move.l d2,(a1)+ - move.l d4,d0 - lsl.l #8,d0 - move.l d0,(a1) - lea CFU_SCSIStruct(a3),a0 + INIT_SCSI_RW SCSIF_WRITE,WRITE10 bsr _Packet tst.b d0 bne.s _wb_serror From 46f836efcb08cc5743119b3d6d798c4306f18a7c Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 08:03:21 +0200 Subject: [PATCH 03/14] cfd: advance the ATAPI LBA and refuse a standing chunk loop The SCSI chunk loop advanced the buffer and the sector count from SCSI_Actual but never the LBA, so every chunk after the first addressed the first one: a read returned wrong data, a write overwrote the same sectors. A short but successful response reaches this at 64 sectors, not only above the 65535-sector cap. A success that moved nothing looped for ever, and a response that was not a whole number of sectors advanced the buffer by bytes while the sector count took the truncated value. Both are errors now. --- src/cfd.s | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/cfd.s b/src/cfd.s index 05a4289..37aeecd 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -5573,9 +5573,14 @@ _rb_s1: bne.s _rb_serror move.l CFU_SCSIStruct+SCSI_Actual(a3),d0 + move.l d0,d1 + and.l #$1ff,d1 + bne.s _rb_serror ;partial sector: accounting would drift add.l d0,a2 lsr.l #8,d0 - lsr.l #1,d0 + lsr.l #1,d0 ;bytes -> sectors + beq.s _rb_serror ;no progress would loop for ever + add.l d0,d2 ;next chunk starts after this one sub.l d0,d3 bgt.s _rb_scsi bra.w _rb_ready @@ -6255,9 +6260,14 @@ _wb_s1: bne.s _wb_serror move.l CFU_SCSIStruct+SCSI_Actual(a3),d0 + move.l d0,d1 + and.l #$1ff,d1 + bne.s _wb_serror ;partial sector: accounting would drift add.l d0,a2 lsr.l #8,d0 - lsr.l #1,d0 + lsr.l #1,d0 ;bytes -> sectors + beq.s _wb_serror ;no progress would loop for ever + add.l d0,d2 ;next chunk starts after this one sub.l d0,d3 bgt.s _wb_scsi bra.w _wb_ready From 607aa79717f493dac1d21dd730490e080e0a7323 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 08:07:59 +0200 Subject: [PATCH 04/14] cfd: size ATAPI transfers by the real block size SCSI_Length and the bytes-to-sectors conversion both assumed 512, while the caller derived the sector count from CFU_BlockSize. On 2048-byte media that asked for a quarter of the data and then counted it four times over; 2352 fell to the partial-sector guard and made no progress at all. Both now multiply and divide by CFU_BlockSize. Sizing a request dynamically can overflow where a fixed 65535 by 512 could not, and _Packet reads a negative length as exhausted, so the chunk is capped by the largest sector count whose byte total stays positive. A zero block size is an error at the head of the loop rather than a division trap inside it. --- src/cfd.s | 56 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/src/cfd.s b/src/cfd.s index 37aeecd..a68cef5 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -5368,8 +5368,8 @@ INIT_SCSI_RW macro lea CFU_SCSIStruct(a3),a0 move.l a2,(a0)+ ;SCSI_Data move.l d4,d0 - lsl.l #8,d0 - add.l d0,d0 ;*2 via add.l (faster than lsl.l #1) + move.l CFU_BlockSize(a3),d1 + UMUL32 ;sectors * block size, not a fixed 512 move.l d0,(a0)+ ;SCSI_Length clr.l (a0)+ ;SCSI_Actual lea CFU_Packet(a3),a1 @@ -5560,8 +5560,18 @@ _rb_c1: ifd ATAPI _rb_scsi: + move.l CFU_BlockSize(a3),d1 + beq.w _rb_serror ;no block size: nothing can be sized + move.l #$7fffffff,d0 + UDIVMOD32 ;most sectors whose byte count stays positive + tst.l d0 + beq.w _rb_serror ;one sector already overflows a request moveq.l #0,d4 - not.w d4 + not.w d4 ;CDB count field is 16 bits + cmp.l d0,d4 + bls.s _rb_cap + move.l d0,d4 ;overflow limit is the tighter one +_rb_cap: cmp.l d4,d3 bcc.s _rb_s1 @@ -5573,16 +5583,18 @@ _rb_s1: bne.s _rb_serror move.l CFU_SCSIStruct+SCSI_Actual(a3),d0 - move.l d0,d1 - and.l #$1ff,d1 + move.l d0,d4 ;bytes moved, for the buffer + move.l CFU_BlockSize(a3),d1 + beq.s _rb_serror ;no block size: cannot account, and divu would trap + UDIVMOD32 ;d0 = sectors, d1 = bytes left over + tst.l d1 bne.s _rb_serror ;partial sector: accounting would drift - add.l d0,a2 - lsr.l #8,d0 - lsr.l #1,d0 ;bytes -> sectors + tst.l d0 beq.s _rb_serror ;no progress would loop for ever + add.l d4,a2 add.l d0,d2 ;next chunk starts after this one sub.l d0,d3 - bgt.s _rb_scsi + bgt.w _rb_scsi bra.w _rb_ready _rb_serror: @@ -6247,8 +6259,18 @@ _wb_scsi: add.l #1,d1 beq.w _wb_eerror ;erase is IDE only + move.l CFU_BlockSize(a3),d1 + beq.w _wb_serror ;no block size: nothing can be sized + move.l #$7fffffff,d0 + UDIVMOD32 ;most sectors whose byte count stays positive + tst.l d0 + beq.w _wb_serror ;one sector already overflows a request moveq.l #0,d4 - not.w d4 + not.w d4 ;CDB count field is 16 bits + cmp.l d0,d4 + bls.s _wb_cap + move.l d0,d4 ;overflow limit is the tighter one +_wb_cap: cmp.l d4,d3 bcc.s _wb_s1 @@ -6260,16 +6282,18 @@ _wb_s1: bne.s _wb_serror move.l CFU_SCSIStruct+SCSI_Actual(a3),d0 - move.l d0,d1 - and.l #$1ff,d1 + move.l d0,d4 ;bytes moved, for the buffer + move.l CFU_BlockSize(a3),d1 + beq.s _wb_serror ;no block size: cannot account, and divu would trap + UDIVMOD32 ;d0 = sectors, d1 = bytes left over + tst.l d1 bne.s _wb_serror ;partial sector: accounting would drift - add.l d0,a2 - lsr.l #8,d0 - lsr.l #1,d0 ;bytes -> sectors + tst.l d0 beq.s _wb_serror ;no progress would loop for ever + add.l d4,a2 add.l d0,d2 ;next chunk starts after this one sub.l d0,d3 - bgt.s _wb_scsi + bgt.w _wb_scsi bra.w _wb_ready _wb_serror: From 933e7446104bf0b7a614bf9be516cdd6d25a422d Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 08:10:39 +0200 Subject: [PATCH 05/14] cfd: say sectors where the block routines mean sectors --- src/cfd.s | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/cfd.s b/src/cfd.s index a68cef5..b1c0d3d 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -721,7 +721,7 @@ CFU_KillTask = 956 ;task to signal on kill CFU_CacheFlags = 960 ;saved cache flags ;--- Multi-sector R/W --- -CFU_MultiSizeRW = 964 ;bytes per transfer (sectors * 512) +CFU_MultiSizeRW = 964 ;sectors per transfer, 256 or the firmware count ;set from card or override (Flags=16) ;--- Runtime-bound I/O handlers (see _BindIOHandlers header for dispatch flow) --- @@ -5392,18 +5392,18 @@ INIT_SCSI_RW macro ; ; Input: ; d0 = starting block number (LBA) -; d1 = byte count to read +; d1 = sector count to read ; a1 = destination buffer pointer ; a3 = CFU pointer ; ; Output: -; d0 = bytes actually read (0 on error) +; d0 = sectors actually read (0 on error) ; ; Register usage: ; d2 = current block number -; d3 = bytes remaining -; d4 = bytes per transfer chunk -; d5 = total bytes (for return value) +; d3 = sectors remaining +; d4 = sectors per transfer chunk +; d5 = total sectors (for return value) ; d6 = sectors per interrupt ; d7 = MOVEM loop counter ; a2 = buffer pointer @@ -6033,18 +6033,18 @@ wb_handler_tab: ; ; Input: ; d0 = starting block number (LBA) -; d1 = byte count to write +; d1 = sector count to write ; a0 = source buffer pointer, or -1 for erase (zero-fill) ; a3 = CFU pointer ; ; Output: -; d0 = bytes actually written (0 on error) +; d0 = sectors actually written (0 on error) ; ; Register usage: ; d2 = current block number -; d3 = bytes remaining -; d4 = bytes per transfer chunk -; d5 = total bytes (for return value) +; d3 = sectors remaining +; d4 = sectors per transfer chunk +; d5 = total sectors (for return value) ; d6 = sectors per interrupt ; d7 = MOVEM loop counter ; a2 = buffer pointer From cba12dc2054c7954b532f9204678877e0b289f34 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 08:19:31 +0200 Subject: [PATCH 06/14] cfd: keep CFD_GETCONFIG inside the caller's buffer The vendor command clamped SCSI_Length down to the structure size but then wrote all twelve bytes regardless, so a caller declaring less got up to eleven bytes written past its buffer while SCSI_Actual honestly reported the smaller figure. The documented contract invites exactly that, since a client is told to read struct_size for versioning and may size its buffer to the version it knows. The struct is built on the stack now and only the requested bytes are copied out. --- src/cfd.s | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/cfd.s b/src/cfd.s index b1c0d3d..e38a975 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -2003,15 +2003,25 @@ _cgc_1: move.l d1,SCSI_Actual(a2) move.l d0,a1 ;destination - ;Build config data in buffer - move.w #CFD_CONFIG_SIZE,(a1)+ ;offset 0-1: structure size (for versioning) - move.b #FILE_VERSION,(a1)+ ;offset 2: major version - move.b #FILE_REVISION,(a1)+ ;offset 3: minor version - move.w CFU_OpenFlags(a3),(a1)+ ;offset 4-5: flags - move.w CFU_MultiSize(a3),(a1)+ ;offset 6-7: firmware multi - move.w CFU_MultiSizeRW(a3),(a1)+ ;offset 8-9: actual multi - move.b CFU_ReceiveMode(a3),(a1)+ ;offset 10: read mode - move.b CFU_WriteMode(a3),(a1)+ ;offset 11: write mode + ;Build the struct on the stack, then hand over only the bytes the + ;caller asked for: a client sized to an older struct_size must not + ;be written past, and probing with a short buffer has to stay safe. + lea -CFD_CONFIG_SIZE(sp),sp + move.l sp,a0 + move.w #CFD_CONFIG_SIZE,(a0)+ ;offset 0-1: structure size (for versioning) + move.b #FILE_VERSION,(a0)+ ;offset 2: major version + move.b #FILE_REVISION,(a0)+ ;offset 3: minor version + move.w CFU_OpenFlags(a3),(a0)+ ;offset 4-5: flags + move.w CFU_MultiSize(a3),(a0)+ ;offset 6-7: firmware multi + move.w CFU_MultiSizeRW(a3),(a0)+ ;offset 8-9: actual multi + move.b CFU_ReceiveMode(a3),(a0)+ ;offset 10: read mode + move.b CFU_WriteMode(a3),(a0)+ ;offset 11: write mode + move.l sp,a0 +_cgc_copy: + move.b (a0)+,(a1)+ + subq.l #1,d1 + bgt.s _cgc_copy + lea CFD_CONFIG_SIZE(sp),sp _cgc_end: moveq.l #0,d0 ;success From b2825147d218f6659d12481a246ec5e05f9e9cdc Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 08:20:46 +0200 Subject: [PATCH 07/14] cfd: document the HD_SCSICMD and GETCONFIG contracts --- src/cfd.s | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/cfd.s b/src/cfd.s index e38a975..eed2023 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -1689,7 +1689,30 @@ _r_odd: ;_Clear: ;--- SCSI direct ------------------------------------------- - +; HD_SCSICMD: run one SCSI command line against this unit. Public, and +; the only way in for the vendor command CFD_GETCONFIG. +; +; Input: +; a2 = &IORequest, IO_Data = &SCSICmd (required, else IOERR_BADLENGTH) +; a3 = CFU pointer +; SCSI_CmdLength must be >= 6 and must equal the length _sc_tab +; records for that opcode; SCSI_Command must be non-NULL +; +; Output: +; d0 = IO_Error: 0, IOERR_BADLENGTH for a malformed request, or a code +; derived from the drive's status +; SCSI_Status = 0, or $02 (CHECK CONDITION) for an opcode this driver +; does not emulate and for a command-length mismatch +; SCSI_CmdActual = the CDB length that was accepted +; SCSI_SenseActual, SCSI_SenseData filled only when SCSIF_AUTOSENSE is +; set in SCSI_Flags +; IO_Actual is cleared on every path; the per-command byte count is +; reported in SCSI_Actual by the handler itself +; +; With the ATAPI handler compiled in and the unit in ATAPI mode +; (CFU_PLength > 0) the whole SCSICmd goes to the drive via _Packet and +; none of the emulation below runs. +; _ScsiCmd: move.l a2,-(sp) moveq.l #IOERR_BADLENGTH,d0 @@ -1766,6 +1789,10 @@ _sc_atapi: bra.s _sc_end endc +; Commands this driver emulates, one entry per opcode: +; dc.w (CDB length)<<8 + opcode, handler - _sc_tab +; terminated by a zero word. The length is checked, not assumed, so an +; opcode sent with the wrong CDB length is refused like an unknown one. _sc_tab: dc.w 10<<8+READ10, _Read10-_sc_tab dc.w 10<<8+WRITE10, _Write10-_sc_tab @@ -1981,6 +2008,11 @@ _aid_end: ; --- v1.37 structure ends here (12 bytes) --- ; Future versions may add more fields after offset 12 ; +; A caller may declare less than struct_size: it then receives that many +; bytes, SCSI_Actual reports what was delivered, and nothing is written +; past the buffer. Two bytes are enough to read struct_size and size a +; second request. +; ; Clients should: ; 1. Request a large buffer (e.g., 64 bytes) ; 2. Check struct_size to know what fields are available From a87de5ff56977141d83f0fa418a4310a1d3d923d Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 09:20:29 +0200 Subject: [PATCH 08/14] cfd: compute the ATAPI chunk cap once per request The overflow cap only depends on CFU_BlockSize, which no packet can change, so the divide belongs above the loop label rather than in front of every packet. _Packet preserves d6, so the cap survives the transfer there. The erase check on the write side tests the caller's buffer pointer and is an entry condition as well; it moves out with it. --- src/cfd.s | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/cfd.s b/src/cfd.s index eed2023..38a4977 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -5446,7 +5446,7 @@ INIT_SCSI_RW macro ; d3 = sectors remaining ; d4 = sectors per transfer chunk ; d5 = total sectors (for return value) -; d6 = sectors per interrupt +; d6 = sectors per interrupt (IDE) / sector cap per chunk (ATAPI) ; d7 = MOVEM loop counter ; a2 = buffer pointer ; @@ -5466,7 +5466,7 @@ _ReadBlocks: ifd ATAPI tst.w CFU_PLength(a3) - bgt.w _rb_scsi + bgt.w _rb_satapi endc bsr _IDEStart @@ -5601,18 +5601,20 @@ _rb_c1: bra.w _rb_0 ifd ATAPI -_rb_scsi: +_rb_satapi: move.l CFU_BlockSize(a3),d1 beq.w _rb_serror ;no block size: nothing can be sized move.l #$7fffffff,d0 UDIVMOD32 ;most sectors whose byte count stays positive tst.l d0 beq.w _rb_serror ;one sector already overflows a request + move.l d0,d6 ;the block size cannot change under the loop +_rb_scsi: moveq.l #0,d4 not.w d4 ;CDB count field is 16 bits - cmp.l d0,d4 + cmp.l d6,d4 bls.s _rb_cap - move.l d0,d4 ;overflow limit is the tighter one + move.l d6,d4 ;overflow limit is the tighter one _rb_cap: cmp.l d4,d3 bcc.s _rb_s1 @@ -6087,7 +6089,7 @@ wb_handler_tab: ; d3 = sectors remaining ; d4 = sectors per transfer chunk ; d5 = total sectors (for return value) -; d6 = sectors per interrupt +; d6 = sectors per interrupt (IDE) / sector cap per chunk (ATAPI) ; d7 = MOVEM loop counter ; a2 = buffer pointer ; @@ -6110,7 +6112,7 @@ _WriteBlocks: ifd ATAPI tst.w CFU_PLength(a3) - bgt.w _wb_scsi + bgt.w _wb_satapi endc bsr _IDEStart @@ -6296,7 +6298,7 @@ _wb_break: bra.w _wb_try ifd ATAPI -_wb_scsi: +_wb_satapi: move.l a2,d1 add.l #1,d1 beq.w _wb_eerror ;erase is IDE only @@ -6307,11 +6309,13 @@ _wb_scsi: UDIVMOD32 ;most sectors whose byte count stays positive tst.l d0 beq.w _wb_serror ;one sector already overflows a request + move.l d0,d6 ;the block size cannot change under the loop +_wb_scsi: moveq.l #0,d4 not.w d4 ;CDB count field is 16 bits - cmp.l d0,d4 + cmp.l d6,d4 bls.s _wb_cap - move.l d0,d4 ;overflow limit is the tighter one + move.l d6,d4 ;overflow limit is the tighter one _wb_cap: cmp.l d4,d3 bcc.s _wb_s1 From 29094f821397c9d76b7ef69a86861fb14448b077 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 09:20:29 +0200 Subject: [PATCH 09/14] cfd: bump the package and device dates The fixed binaries carry a new stamp. --- Makefile | 4 ++-- docs/changes.md | 4 ++-- src/cfd_version.i | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index cfa1781..1e39120 100644 --- a/Makefile +++ b/Makefile @@ -6,14 +6,14 @@ # Release version: YYYYMMDD package date + optional in-progress suffix # (-dev, -rc1, ...). Empty suffix for a final release. -RELEASE_DATE = 20260904 +RELEASE_DATE = 20260911 VERSION_SUFFIX = -dev # compactflash.device version CFD_MAJOR = 2 CFD_MINOR = 0 CFD_VERSION_SUFFIX = -dev -CFD_DATE = 27.08.2026 +CFD_DATE = 11.09.2026 # compactflash.automount version (optional boot/automount module) AUTOMOUNT_MAJOR = 2 diff --git a/docs/changes.md b/docs/changes.md index b0da68f..17fa8e0 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,9 +1,9 @@ -## 20260904-dev +## 20260911-dev _Components in this release_: -- `compactflash.device 2.0-dev (27.08.2026)` _(new)_ +- `compactflash.device 2.0-dev (11.09.2026)` _(new)_ - `compactflash.automount 2.0-dev (27.08.2026)` _(new)_ - `ptable.library 2.0-dev (27.08.2026)` _(new)_ - `CFInfo 1.37 (11.01.2026)` diff --git a/src/cfd_version.i b/src/cfd_version.i index ce06cde..83efa89 100644 --- a/src/cfd_version.i +++ b/src/cfd_version.i @@ -3,8 +3,8 @@ FILE_VERSION = 2 FILE_REVISION = 0 VERSION_STRING macro ifd __68020__ - dc.b "compactflash.device 2.0-dev (27.08.2026) [68020]" + dc.b "compactflash.device 2.0-dev (11.09.2026) [68020]" else - dc.b "compactflash.device 2.0-dev (27.08.2026) [68000]" + dc.b "compactflash.device 2.0-dev (11.09.2026) [68000]" endc endm From 7762271e6dd88bef3b2e4ee7655667bf9deab0f9 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 13:19:13 +0200 Subject: [PATCH 10/14] cfd: correct three block and GETCONFIG contract comments INIT_SCSI_RW loads the block size into d1 for the length multiply, so d1 is clobbered as well. _ReadBlocks and _WriteBlocks funnel every exit through the same tail and return the sectors completed, so an error yields a partial count, not zero. CFD_GETCONFIG with a zero length or a null pointer writes nothing and does not touch SCSI_Actual, which stays as the caller left it. --- dist/docs/changes.guide | 14 +++++++------- docs/changes.md | 4 ++-- src/cfd.s | 12 ++++++++---- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/dist/docs/changes.guide b/dist/docs/changes.guide index 846c381..b1bfb60 100644 --- a/dist/docs/changes.guide +++ b/dist/docs/changes.guide @@ -1,5 +1,5 @@ @database "compactflash.device release notes" -@$VER: compactflash.device release notes guide 20260904-dev (04.09.2026) +@$VER: compactflash.device release notes guide 20260911-dev (11.09.2026) @author "Generated by md2guide.py v1.6 (14.06.2026)" @(c) "See LICENSE" @font topaz.font 8 @@ -10,7 +10,7 @@ @{b}compactflash.device release notes@{ub} - @{"20260904-dev" link 20260904_dev} + @{"20260911-dev" link 20260911_dev} @{"20260614" link 20260614} @{"20260609" link 20260609} @{"v1.43 (19.05.2026)" link v1_43__19_05_2026_} @@ -32,7 +32,7 @@ @{"20260609" link 20260609} @{"20260614" link 20260614} - @{"20260904-dev" link 20260904_dev} + @{"20260911-dev" link 20260911_dev} @{b}O@{ub} @{"Original CFD History Through v1.33" link Original_CFD_History_Through_v1_33} @{b}V@{ub} @@ -49,12 +49,12 @@ @endnode -@node 20260904_dev "20260904-dev" -@{b}20260904-dev@{ub} +@node 20260911_dev "20260911-dev" +@{b}20260911-dev@{ub} @{i}Components in this release@{ui}: - * @{fg shine}compactflash.device 2.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} + * @{fg shine}compactflash.device 2.0-dev (11.09.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}compactflash.automount 2.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}ptable.library 2.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}CFInfo 1.37 (11.01.2026)@{fg text} @@ -122,7 +122,7 @@ Documentation-only update (no binaries changed). Release notes and original CFD history are included in @{" docs/changes.guide " link "changes.guide/Main"} document. ---------------------------------------- -@{"<< Prev" link 20260904_dev} @{"Contents" link Main} @{"Next >>" link 20260609} +@{"<< Prev" link 20260911_dev} @{"Contents" link Main} @{"Next >>" link 20260609} @endnode diff --git a/docs/changes.md b/docs/changes.md index 17fa8e0..282de6c 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -5,11 +5,11 @@ _Components in this release_: - `compactflash.device 2.0-dev (11.09.2026)` _(new)_ - `compactflash.automount 2.0-dev (27.08.2026)` _(new)_ -- `ptable.library 2.0-dev (27.08.2026)` _(new)_ +- `ptable.library 2.0-dev (11.09.2026)` _(new)_ - `CFInfo 1.37 (11.01.2026)` - `pcmciaspeed 1.36 (02.01.2026)` - `pcmciacheck 2.0 (06.08.2026)` _(new)_ -- `lsptres 1.0-dev (27.08.2026)` _(new)_ +- `lsptres 1.0-dev (11.09.2026)` _(new)_ #### New major version of compactflash.device 2.0 driver diff --git a/src/cfd.s b/src/cfd.s index 38a4977..1d5c859 100644 --- a/src/cfd.s +++ b/src/cfd.s @@ -2011,7 +2011,9 @@ _aid_end: ; A caller may declare less than struct_size: it then receives that many ; bytes, SCSI_Actual reports what was delivered, and nothing is written ; past the buffer. Two bytes are enough to read struct_size and size a -; second request. +; second request. A zero length or a null pointer is a no-op that still +; reports success: nothing is written, and SCSI_Actual keeps whatever the +; caller left there. ; ; Clients should: ; 1. Request a large buffer (e.g., 64 bytes) @@ -5405,7 +5407,7 @@ _gid_end: ifd ATAPI ; In: a2 = buffer, d2 = LBA, d4 = block count, a3 = unit. -; Out: a0 = SCSI structure for _Packet. Clobbers d0/a1. +; Out: a0 = SCSI structure for _Packet. Clobbers d0/d1/a1. INIT_SCSI_RW macro lea CFU_SCSIStruct(a3),a0 move.l a2,(a0)+ ;SCSI_Data @@ -5439,7 +5441,8 @@ INIT_SCSI_RW macro ; a3 = CFU pointer ; ; Output: -; d0 = sectors actually read (0 on error) +; d0 = sectors actually read, which after an error is what completed +; before it; the code is in CFU_IOErr ; ; Register usage: ; d2 = current block number @@ -6082,7 +6085,8 @@ wb_handler_tab: ; a3 = CFU pointer ; ; Output: -; d0 = sectors actually written (0 on error) +; d0 = sectors actually written, which after an error is what completed +; before it; the code is in CFU_IOErr ; ; Register usage: ; d2 = current block number From 50eeffcc0e4e9dbeac7269e09fb8aa7cea18fb7c Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 18:26:31 +0200 Subject: [PATCH 11/14] Rebuild the C tools when their version or date changes VERSION and DATE reach cfinfo, pcmciaspeed and pcmciacheck through the compiler command line, and the targets had no prerequisite on the Makefile that holds them, so a bump never reached a built tool without a clean. --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 1e39120..3dcce24 100644 --- a/Makefile +++ b/Makefile @@ -439,19 +439,19 @@ $(GUIDE_LSPTRES): $(PTABLE_VERSION_FILE) $(Q)cp $(PTABLE)/dist/docs/lsptres.guide $@ $(Q)echo " PTABLE $@" -$(TARGET_CFINFO): $(SOURCE_CFINFO) +$(TARGET_CFINFO): $(SOURCE_CFINFO) Makefile $(Q)mkdir -p $(OUTDIR_C) $(Q)echo " VBCC $(TARGET_CFINFO)" $(Q)VBCC=$(VBCC_HOME) PATH=$(VBCC_HOME)/bin:$$PATH $(VBCC) +aos68k -O2 -c99 -INDK/Include_H -DVERSION='"$(CFINFO_VERSION)"' -DDATE='"$(CFINFO_DATE)"' -o $(TARGET_CFINFO) $< $(Q)echo " $$(stat -c%s $(TARGET_CFINFO)) bytes, md5:$$(md5sum $(TARGET_CFINFO) | cut -c1-8)" -$(TARGET_PCMCIASPEED): $(SOURCE_PCMCIASPEED) +$(TARGET_PCMCIASPEED): $(SOURCE_PCMCIASPEED) Makefile $(Q)mkdir -p $(OUTDIR_C) $(Q)echo " VBCC $(TARGET_PCMCIASPEED)" $(Q)VBCC=$(VBCC_HOME) PATH=$(VBCC_HOME)/bin:$$PATH $(VBCC) +aos68k -O2 -c99 -INDK/Include_H -DVERSION='"$(PCMCIASPEED_VERSION)"' -DDATE='"$(PCMCIASPEED_DATE)"' -o $(TARGET_PCMCIASPEED) $< $(Q)echo " $$(stat -c%s $(TARGET_PCMCIASPEED)) bytes, md5:$$(md5sum $(TARGET_PCMCIASPEED) | cut -c1-8)" -$(TARGET_PCMCIACHECK): $(SOURCE_PCMCIACHECK) +$(TARGET_PCMCIACHECK): $(SOURCE_PCMCIACHECK) Makefile $(Q)mkdir -p $(OUTDIR_C) $(Q)echo " VBCC $(TARGET_PCMCIACHECK)" $(Q)VBCC=$(VBCC_HOME) PATH=$(VBCC_HOME)/bin:$$PATH $(VBCC) +aos68k -O2 -c99 -INDK/Include_H -DVERSION='"$(PCMCIACHECK_VERSION)"' -DDATE='"$(PCMCIACHECK_DATE)"' -o $(TARGET_PCMCIACHECK) $< From 39ff508fa85e1bf35a8b4dc65d68ea23a233251c Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 18:26:38 +0200 Subject: [PATCH 12/14] CFInfo: page the report and drop the CR line endings The report is longer than a window, so it scrolls past before it can be read. It now pauses each screenful, taking the height from the console's own WINDOW STATUS REPORT; any key continues, Q stops. Paging engages only when input and output are the same console and it reports a plausible height, so a redirected stream is unaffected. Lines end in LF alone, like the other tools. --- Makefile | 4 +- dist.readme.in | 6 + dist/docs/CFInfo.guide | 8 +- dist/docs/changes.guide | 11 +- docs/CFInfo.md | 5 +- docs/changes.md | 15 +- src/cfinfo.c | 310 ++++++++++++++++++++++++++++------------ 7 files changed, 254 insertions(+), 105 deletions(-) diff --git a/Makefile b/Makefile index 3dcce24..746ec52 100644 --- a/Makefile +++ b/Makefile @@ -23,9 +23,9 @@ AUTOMOUNT_DATE = 27.08.2026 # Tool-specific versions CFINFO_MAJOR = 1 -CFINFO_MINOR = 37 +CFINFO_MINOR = 38 CFINFO_VERSION_SUFFIX = -CFINFO_DATE = 11.01.2026 +CFINFO_DATE = 11.09.2026 PCMCIASPEED_MAJOR = 1 PCMCIASPEED_MINOR = 36 diff --git a/dist.readme.in b/dist.readme.in index 1999706..220c925 100644 --- a/dist.readme.in +++ b/dist.readme.in @@ -39,6 +39,12 @@ New major version of ptable.library 2.0 (bundled): a shared partition.resource. The new lsptres tool lists the resource (https://github.com/pulchart/amigaos-ptable). +Tools 'CFInfo 1.38': + +* The report prints one screenful at a time; any key continues, Q + stops. +* Output lines end in LF alone. + Tools 'pcmciacheck 2.0': * New "-identify" read-stability test: reads the same sector several diff --git a/dist/docs/CFInfo.guide b/dist/docs/CFInfo.guide index 68cbdd1..456a5bf 100644 --- a/dist/docs/CFInfo.guide +++ b/dist/docs/CFInfo.guide @@ -1,5 +1,5 @@ @database "CFInfo - CompactFlash Card Information Tool" -@$VER: CFInfo guide 1.37 (11.01.2026) +@$VER: CFInfo guide 1.38 (11.09.2026) @author "Generated by md2guide.py v1.6 (14.06.2026)" @(c) "See LICENSE" @font topaz.font 8 @@ -103,9 +103,13 @@ using the @{fg shine}compactflash.device@{fg text} driver. CFInfo 1 ; Show info for unit 1 @{fg text} +The report prints one screenful at a time; any key continues, @{fg shine}Q@{fg text} stops. +Output +redirected to a file or another stream scrolls without pausing. + Example Output: @{fg highlight} - CFInfo 1.37 - CompactFlash Card Information + CFInfo 1.38 - CompactFlash Card Information Device: compactflash.device unit 0 === CompactFlash Card Information === diff --git a/dist/docs/changes.guide b/dist/docs/changes.guide index b1bfb60..2183531 100644 --- a/dist/docs/changes.guide +++ b/dist/docs/changes.guide @@ -57,7 +57,7 @@ * @{fg shine}compactflash.device 2.0-dev (11.09.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}compactflash.automount 2.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}ptable.library 2.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} - * @{fg shine}CFInfo 1.37 (11.01.2026)@{fg text} + * @{fg shine}CFInfo 1.38 (11.09.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}pcmciaspeed 1.36 (02.01.2026)@{fg text} * @{fg shine}pcmciacheck 2.0 (06.08.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}lsptres 1.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} @@ -81,7 +81,14 @@ partition tables and publishes every partition into a shared @{fg shine}partition.resource@{fg text} . The new @{fg shine}lsptres@{fg text} tool lists the resource. See @{" ptable.guide " link "ptable.guide/Main"} and @{" lsptres.guide " link "lsptres.guide/Main"} . -@{b}Tools 'pcmciacheck 2.0'@{ub} +@{b}Tools@{ub} + +@{b}'CFInfo 1.38'@{ub} + + * The report prints one screenful at a time; any key continues, @{fg shine}Q@{fg text} stops. + * Output lines end in @{fg shine}LF@{fg text} alone. + +@{b}'pcmciacheck 2.0'@{ub} * @{b}New @{fg shine}-identify@{fg text} read-stability test.@{ub} (#67 (https://github.com/pulchart/cfd/issues/67)) Reads the same sector several diff --git a/docs/CFInfo.md b/docs/CFInfo.md index 4ad77b1..c4abbd9 100644 --- a/docs/CFInfo.md +++ b/docs/CFInfo.md @@ -16,9 +16,12 @@ CFInfo ; Show info for unit 0 CFInfo 1 ; Show info for unit 1 ``` +The report prints one screenful at a time; any key continues, `Q` stops. Output +redirected to a file or another stream scrolls without pausing. + Example Output: ``` -CFInfo 1.37 - CompactFlash Card Information +CFInfo 1.38 - CompactFlash Card Information Device: compactflash.device unit 0 === CompactFlash Card Information === diff --git a/docs/changes.md b/docs/changes.md index 282de6c..59e1da9 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -5,11 +5,11 @@ _Components in this release_: - `compactflash.device 2.0-dev (11.09.2026)` _(new)_ - `compactflash.automount 2.0-dev (27.08.2026)` _(new)_ -- `ptable.library 2.0-dev (11.09.2026)` _(new)_ -- `CFInfo 1.37 (11.01.2026)` +- `ptable.library 2.0-dev (27.08.2026)` _(new)_ +- `CFInfo 1.38 (11.09.2026)` _(new)_ - `pcmciaspeed 1.36 (02.01.2026)` - `pcmciacheck 2.0 (06.08.2026)` _(new)_ -- `lsptres 1.0-dev (11.09.2026)` _(new)_ +- `lsptres 1.0-dev (27.08.2026)` _(new)_ #### New major version of compactflash.device 2.0 driver @@ -20,7 +20,14 @@ _Components in this release_: - **Unified partition scanning.** A shared partition-table library the driver now uses instead of its own parser. It scans RDB, MBR, GPT and flat (whole-disk) partition tables and publishes every partition into a shared `partition.resource`. The new `lsptres` tool lists the resource. See [ptable.md](https://github.com/pulchart/amigaos-ptable/blob/HEAD/docs/ptable.md) and [lsptres.md](https://github.com/pulchart/amigaos-ptable/blob/HEAD/docs/lsptres.md). -#### Tools 'pcmciacheck 2.0' +#### Tools + +##### 'CFInfo 1.38' + +- The report prints one screenful at a time; any key continues, `Q` stops. +- Output lines end in `LF` alone. + +##### 'pcmciacheck 2.0' - **New `-identify` read-stability test.** ([#67](https://github.com/pulchart/cfd/issues/67)) Reads the same sector several times per mode and reports `STABLE`, `UNSTABLE` or `STUCK`. A card that returns different bytes on each read, or the same word over and over, corrupts files, and that is why the driver refuses it with `FAILED (data mismatch)` or `FAILED (repeated pattern)`. Only the mode the driver actually uses decides the verdict. `-r ` sets the number of runs (default 5). Console only, no log file, like `-cis`. diff --git a/src/cfinfo.c b/src/cfinfo.c index 79a9d5b..9fc811e 100644 --- a/src/cfinfo.c +++ b/src/cfinfo.c @@ -22,6 +22,9 @@ const char version[] = MAKE_VERSION_STRING("CFInfo"); #include #include +#include + +#include #include #include #include @@ -87,6 +90,121 @@ UBYTE *scsi_sense = NULL; struct SCSICmd *scsi_cmd = NULL; UBYTE scsi_cdb[12]; +/* --- console pager ------------------------------------------------- + * + * One screenful at a time: any key continues, Q stops the rest of the + * report. Paging is on only when input and output are the same console, + * and only when that console reports a plausible height; a redirected + * or silent stream scrolls as before. + */ +#define PAGE_PROMPT "-- more -- (any key, Q quits)" + +static BPTR page_in, page_out; +static int page_rows; /* usable lines per page, 0 = no paging */ +static int page_left; +static int page_stop; /* the reader asked to stop */ +static char page_erase[sizeof(PAGE_PROMPT) + 1]; /* CR, blanks, CR */ + +/* Ask the console how tall its window is. RAW mode must already be set. + * WINDOW STATUS REQUEST is answered by a WINDOW BOUNDS REPORT, + * CSI ;;; SP r, whose third field is the height. + */ +static int page_query_rows(void) +{ + int fields = 0, num = 0, rows = 0, guard = 40; + UBYTE c; + + Write(page_out, "\033[ q", 4); + while (guard--) { + if (!WaitForChar(page_in, 200000)) return 0; /* console stayed silent */ + if (Read(page_in, &c, 1) != 1) return 0; + if (c == 'r') return (fields >= 3) ? rows : 0; /* too short to trust */ + if (c == ';') { + if (++fields == 3) rows = num; + num = 0; + continue; + } + if (c < '0' || c > '9') continue; + if (num < 1000) num = num * 10 + (c - '0'); /* absurd: stop adding */ + } + return 0; +} + +static void page_begin(void) +{ + struct FileHandle *in, *out; + int rows; + + page_rows = page_left = page_stop = 0; + page_in = Input(); + page_out = Output(); + if (!page_in || !page_out) return; + if (!IsInteractive(page_in) || !IsInteractive(page_out)) return; + + /* The query is written to the output and answered on the input, so both + * must be the same handler. Equal fh_Type means one console; a redirected + * ">SER:" is a different port and gets neither the query nor a pause. + */ + in = (struct FileHandle *)BADDR(page_in); + out = (struct FileHandle *)BADDR(page_out); + if (in->fh_Type != out->fh_Type) return; + + SetMode(page_in, 1); /* RAW for the query and every keypress */ + rows = page_query_rows() - 1; /* the prompt needs a line of its own */ + if (rows < 4 || rows > 200) { /* implausible height, do not guess */ + SetMode(page_in, 0); + return; + } + page_rows = page_left = rows; + + page_erase[0] = '\r'; + memset(page_erase + 1, ' ', sizeof(PAGE_PROMPT) - 1); + page_erase[sizeof(PAGE_PROMPT)] = '\r'; +} + +static void page_end(void) +{ + if (!page_rows) return; + page_rows = 0; + SetMode(page_in, 0); /* always hand the shell back cooked */ +} + +/* Call after writing one line. Returns 0 when the reader asked to stop. */ +static int page_line(void) +{ + UBYTE key = '\n'; + + if (!page_rows) return 1; + if (--page_left > 0) return 1; + + fflush(stdout); /* the prompt bypasses stdio */ + Write(page_out, PAGE_PROMPT, sizeof(PAGE_PROMPT) - 1); + if (Read(page_in, &key, 1) != 1) key = '\n'; + Write(page_out, page_erase, sizeof(page_erase)); + page_left = page_rows; /* a fresh page */ + if ((key & 0xdf) == 'Q') { /* fold case */ + page_stop = 1; + return 0; + } + return 1; +} + +/* printf that keeps the page accounting. No format here spans two lines, + * so one newline in the format is one line on screen. + */ +static void pout(const char *fmt, ...) +{ + va_list ap; + const char *c; + + if (page_stop) return; + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + for (c = fmt; *c; c++) + if (*c == '\n' && !page_line()) return; +} + /* Extract and clean a string from IDENTIFY data */ /* Note: On 68k (big-endian), ATA strings are already in correct byte order */ void GetIDString(UWORD *id_data, int start_word, int num_words, char *dest) @@ -173,13 +291,13 @@ void PrintSize(ULONG sectors) ULONG gb = mb / 1024; if (gb > 0) { - printf("%lu.%lu GB", gb, (mb % 1024) * 10 / 1024); + pout("%lu.%lu GB", gb, (mb % 1024) * 10 / 1024); } else if (mb > 0) { - printf("%lu.%lu MB", mb, (kb % 1024) * 10 / 1024); + pout("%lu.%lu MB", mb, (kb % 1024) * 10 / 1024); } else { - printf("%lu KB", kb); + pout("%lu KB", kb); } - printf(" (%lu sectors)\r\n", sectors); + pout(" (%lu sectors)\n", sectors); } /* Print card information from IDENTIFY data */ @@ -199,109 +317,109 @@ void PrintCardInfo(UWORD *id) multi = id[ID_MAXMULTI] & 0xFF; sectors = GetIDLong(id, ID_LBA_SECTORS); - printf("\r\n"); - printf("=== CompactFlash Card Information ===\r\n"); - printf("\r\n"); - printf("Model: %s\r\n", model); - printf("Serial: %s\r\n", serial); - printf("Firmware: %s\r\n", firmware); - printf("\r\n"); + pout("\n"); + pout("=== CompactFlash Card Information ===\n"); + pout("\n"); + pout("Model: %s\n", model); + pout("Serial: %s\n", serial); + pout("Firmware: %s\n", firmware); + pout("\n"); - printf("=== Capacity ===\r\n"); - printf("Size: "); + pout("=== Capacity ===\n"); + pout("Size: "); PrintSize(sectors); - printf("Geometry: %u cyl, %u heads, %u sectors/track\r\n", + pout("Geometry: %u cyl, %u heads, %u sectors/track\n", id[ID_CYLS], id[ID_HEADS], id[ID_SECTORS]); - printf("\r\n"); + pout("\n"); - printf("=== Capabilities ===\r\n"); - printf("LBA: %s\r\n", (caps & 0x0200) ? "Yes" : "No"); - printf("DMA: %s\r\n", (caps & 0x0100) ? "Yes" : "No"); + pout("=== Capabilities ===\n"); + pout("LBA: %s\n", (caps & 0x0200) ? "Yes" : "No"); + pout("DMA: %s\n", (caps & 0x0100) ? "Yes" : "No"); /* PIO modes */ - printf("PIO Modes: 0"); - if (id[ID_PIO_OLD] >= 1) printf(", 1"); - if (id[ID_PIO_OLD] >= 2) printf(", 2"); - if (pio_modes & 0x01) printf(", 3"); - if (pio_modes & 0x02) printf(", 4"); - printf("\r\n"); + pout("PIO Modes: 0"); + if (id[ID_PIO_OLD] >= 1) pout(", 1"); + if (id[ID_PIO_OLD] >= 2) pout(", 2"); + if (pio_modes & 0x01) pout(", 3"); + if (pio_modes & 0x02) pout(", 4"); + pout("\n"); /* Multi-sector */ if (multi > 0) { - printf("Multi-sect: Max %u sectors/interrupt\r\n", multi); + pout("Multi-sect: Max %u sectors/interrupt\n", multi); } else { - printf("Multi-sect: Not supported\r\n"); + pout("Multi-sect: Not supported\n"); } /* UDMA modes */ if (id[ID_UDMA_MODES] != 0) { - printf("UDMA Modes: "); - if (id[ID_UDMA_MODES] & 0x01) printf("0 "); - if (id[ID_UDMA_MODES] & 0x02) printf("1 "); - if (id[ID_UDMA_MODES] & 0x04) printf("2 "); - if (id[ID_UDMA_MODES] & 0x08) printf("3 "); - if (id[ID_UDMA_MODES] & 0x10) printf("4 "); - if (id[ID_UDMA_MODES] & 0x20) printf("5 "); - if (id[ID_UDMA_MODES] & 0x40) printf("6 "); - printf("\r\n"); + pout("UDMA Modes: "); + if (id[ID_UDMA_MODES] & 0x01) pout("0 "); + if (id[ID_UDMA_MODES] & 0x02) pout("1 "); + if (id[ID_UDMA_MODES] & 0x04) pout("2 "); + if (id[ID_UDMA_MODES] & 0x08) pout("3 "); + if (id[ID_UDMA_MODES] & 0x10) pout("4 "); + if (id[ID_UDMA_MODES] & 0x20) pout("5 "); + if (id[ID_UDMA_MODES] & 0x40) pout("6 "); + pout("\n"); } - printf("\r\n"); - printf("=== Card Type ===\r\n"); - printf("Removable: %s\r\n", (config & 0x0080) ? "Yes" : "No"); - printf("Type: "); + pout("\n"); + pout("=== Card Type ===\n"); + pout("Removable: %s\n", (config & 0x0080) ? "Yes" : "No"); + pout("Type: "); /* Check for CompactFlash signature (0x848x) */ if ((config & 0xFFF0) == 0x8480) { - printf("CompactFlash\r\n"); + pout("CompactFlash\n"); } else if ((config & 0x8000) == 0) { - printf("ATA\r\n"); + pout("ATA\n"); } else { - printf("ATAPI\r\n"); + pout("ATAPI\n"); } /* Command Sets / Features */ - printf("\r\n"); - printf("=== Features (SET FEATURES capable) ===\r\n"); + pout("\n"); + pout("=== Features (SET FEATURES capable) ===\n"); if (id[ID_CMD_SET1] || id[ID_CMD_SET2]) { UWORD cmd1 = id[ID_CMD_SET1]; UWORD cmd2 = id[ID_CMD_SET2]; UWORD en1 = id[ID_CMD_EN1]; UWORD en2 = id[ID_CMD_EN2]; - printf(" Supported Enabled\r\n"); + pout(" Supported Enabled\n"); /* Word 82 bits */ if (cmd1 & 0x0020) - printf("Write Cache: Yes %s\r\n", (en1 & 0x0020) ? "Yes" : "No"); + pout("Write Cache: Yes %s\n", (en1 & 0x0020) ? "Yes" : "No"); if (cmd1 & 0x0040) - printf("Read Look-ahead: Yes %s\r\n", (en1 & 0x0040) ? "Yes" : "No"); + pout("Read Look-ahead: Yes %s\n", (en1 & 0x0040) ? "Yes" : "No"); if (cmd1 & 0x0008) - printf("Power Management: Yes %s\r\n", (en1 & 0x0008) ? "Yes" : "No"); + pout("Power Management: Yes %s\n", (en1 & 0x0008) ? "Yes" : "No"); if (cmd1 & 0x0004) - printf("Security Mode: Yes %s\r\n", (en1 & 0x0004) ? "Yes" : "No"); + pout("Security Mode: Yes %s\n", (en1 & 0x0004) ? "Yes" : "No"); if (cmd1 & 0x0001) - printf("SMART: Yes %s\r\n", (en1 & 0x0001) ? "Yes" : "No"); + pout("SMART: Yes %s\n", (en1 & 0x0001) ? "Yes" : "No"); /* Word 83 bits */ if (cmd2 & 0x0400) - printf("48-bit LBA: Yes %s\r\n", (en2 & 0x0400) ? "Yes" : "No"); + pout("48-bit LBA: Yes %s\n", (en2 & 0x0400) ? "Yes" : "No"); if (cmd2 & 0x1000) - printf("Write FUA: Yes %s\r\n", (en2 & 0x1000) ? "Yes" : "No"); + pout("Write FUA: Yes %s\n", (en2 & 0x1000) ? "Yes" : "No"); if (cmd2 & 0x0020) - printf("PUIS: Yes %s\r\n", (en2 & 0x0020) ? "Yes" : "No"); + pout("PUIS: Yes %s\n", (en2 & 0x0020) ? "Yes" : "No"); if (cmd2 & 0x0008) - printf("APM: Yes %s\r\n", (en2 & 0x0008) ? "Yes" : "No"); + pout("APM: Yes %s\n", (en2 & 0x0008) ? "Yes" : "No"); /* CFA specific */ if (cmd2 & 0x4000) - printf("CFA Features: Yes\r\n"); + pout("CFA Features: Yes\n"); } else { - printf("(not reported by card)\r\n"); + pout("(not reported by card)\n"); } /* CF Advanced True IDE Timing (Word 163) */ - printf("\r\n"); - printf("=== CF True IDE Timing (Word 163) ===\r\n"); + pout("\n"); + pout("=== CF True IDE Timing (Word 163) ===\n"); if (id[ID_CFA_IDE] & 0x8000) { UWORD ide = id[ID_CFA_IDE]; UWORD pio_no_iordy = ide & 0x07; @@ -311,19 +429,19 @@ void PrintCardInfo(UWORD *id) /* PIO mode to cycle time lookup */ static const char *pio_ns[] = {"600", "383", "240", "180", "120", "100", "80", "?"}; - printf("PIO (no IORDY): max=%u (%sns cycle)\r\n", + pout("PIO (no IORDY): max=%u (%sns cycle)\n", (unsigned)pio_no_iordy, pio_ns[pio_no_iordy]); - printf("PIO (IORDY): max=%u (%sns cycle)\r\n", + pout("PIO (IORDY): max=%u (%sns cycle)\n", (unsigned)pio_iordy, pio_ns[pio_iordy]); if (mdma_max > 0) - printf("Multiword DMA: max=%u\r\n", (unsigned)mdma_max); + pout("Multiword DMA: max=%u\n", (unsigned)mdma_max); } else { - printf("(not reported by card)\r\n"); + pout("(not reported by card)\n"); } /* CF Advanced PCMCIA Timing (Word 164) */ - printf("\r\n"); - printf("=== CF PCMCIA Timing (Word 164) ===\r\n"); + pout("\n"); + pout("=== CF PCMCIA Timing (Word 164) ===\n"); if (id[ID_CFA_TIMING] & 0x8000) { UWORD timing = id[ID_CFA_TIMING]; UWORD mem_max = timing & 0x07; @@ -334,19 +452,19 @@ void PrintCardInfo(UWORD *id) /* Timing mode to nanoseconds lookup (modes 6-7 are vendor-specific) */ static const char *mode_ns[] = {"600", "250", "150", "100", "80", "50", "?", "?"}; - printf("Memory Mode: max=%u (%sns), current=%u (%sns)\r\n", + pout("Memory Mode: max=%u (%sns), current=%u (%sns)\n", (unsigned)mem_max, mode_ns[mem_max], (unsigned)mem_cur, mode_ns[mem_cur]); - printf("I/O Mode: max=%u (%sns), current=%u (%sns)\r\n", + pout("I/O Mode: max=%u (%sns), current=%u (%sns)\n", (unsigned)io_max, mode_ns[io_max], (unsigned)io_cur, mode_ns[io_cur]); } else { - printf("(not reported by card)\r\n"); + pout("(not reported by card)\n"); } /* Gayle timing register - actual hardware setting */ - printf("\r\n"); - printf("=== Gayle Timing (hardware) ===\r\n"); + pout("\n"); + pout("=== Gayle Timing (hardware) ===\n"); { volatile UBYTE *gayle = (volatile UBYTE *)0x00DAB000; UBYTE reg_val = *gayle; @@ -361,30 +479,30 @@ void PrintCardInfo(UWORD *id) case 3: gayle_ns = "720"; break; default: gayle_ns = "?"; break; } - printf("Memory Speed: %sns\r\n", gayle_ns); + pout("Memory Speed: %sns\n", gayle_ns); } } /* Print driver configuration */ void PrintDriverConfig(struct CFDConfig *cfg) { - printf("\r\n"); - printf("=== Driver Configuration ===\r\n"); - printf("Driver Ver: %u.%u\r\n", cfg->version_major, cfg->version_minor); - printf("Mount Flags: %u (", cfg->open_flags); + pout("\n"); + pout("=== Driver Configuration ===\n"); + pout("Driver Ver: %u.%u\n", cfg->version_major, cfg->version_minor); + pout("Mount Flags: %u (", cfg->open_flags); if (cfg->open_flags == 0) { - printf("none"); + pout("none"); } else { int first = 1; - if (cfg->open_flags & 1) { printf("%scfd_first", first ? "" : ", "); first = 0; } - if (cfg->open_flags & 2) { printf("%sskip_sig", first ? "" : ", "); first = 0; } - if (cfg->open_flags & 4) { printf("%scompat", first ? "" : ", "); first = 0; } - if (cfg->open_flags & 8) { printf("%sserial_debug", first ? "" : ", "); first = 0; } - if (cfg->open_flags & 16) { printf("%sforce_multi", first ? "" : ", "); first = 0; } - if (cfg->open_flags & 32) { printf("%sno_autodetect", first ? "" : ", "); first = 0; } + if (cfg->open_flags & 1) { pout("%scfd_first", first ? "" : ", "); first = 0; } + if (cfg->open_flags & 2) { pout("%sskip_sig", first ? "" : ", "); first = 0; } + if (cfg->open_flags & 4) { pout("%scompat", first ? "" : ", "); first = 0; } + if (cfg->open_flags & 8) { pout("%sserial_debug", first ? "" : ", "); first = 0; } + if (cfg->open_flags & 16) { pout("%sforce_multi", first ? "" : ", "); first = 0; } + if (cfg->open_flags & 32) { pout("%sno_autodetect", first ? "" : ", "); first = 0; } } - printf(")\r\n"); - printf("Multi-sect: FW=%u, Used=%u\r\n", cfg->multi_size, cfg->multi_size_rw); + pout(")\n"); + pout("Multi-sect: FW=%u, Used=%u\n", cfg->multi_size, cfg->multi_size_rw); /* Transfer modes - combined R/W display */ { @@ -409,12 +527,13 @@ void PrintDriverConfig(struct CFDConfig *cfg) default: sprintf(write_buf, "mode %u", cfg->write_mode); write_mode = write_buf; break; } - printf("R/W Mode: %s/%s\r\n", read_mode, write_mode); + pout("R/W Mode: %s/%s\n", read_mode, write_mode); } } void Cleanup(void) { + page_end(); if (io) { if (io->io_Device) { CloseDevice((struct IORequest *)io); @@ -431,7 +550,9 @@ int main(int argc, char **argv) { int unit = 0; - printf("CFInfo " STR(VERSION) " - CompactFlash Card Information\r\n"); + page_begin(); + + pout("CFInfo " STR(VERSION) " - CompactFlash Card Information\n"); /* Parse arguments */ if (argc > 1) { @@ -441,13 +562,14 @@ int main(int argc, char **argv) /* Allocate resources */ mp = CreateMsgPort(); if (!mp) { - printf("Error: Cannot create message port\r\n"); + pout("Error: Cannot create message port\n"); + Cleanup(); /* the console must not stay RAW */ return 10; } io = (struct IOStdReq *)CreateIORequest(mp, sizeof(struct IOStdReq)); if (!io) { - printf("Error: Cannot create IO request\r\n"); + pout("Error: Cannot create IO request\n"); Cleanup(); return 10; } @@ -457,32 +579,32 @@ int main(int argc, char **argv) scsi_cmd = AllocMem(sizeof(struct SCSICmd), MEMF_PUBLIC | MEMF_CLEAR); if (!data_buf || !scsi_sense || !scsi_cmd) { - printf("Error: Cannot allocate memory\r\n"); + pout("Error: Cannot allocate memory\n"); Cleanup(); return 10; } /* Open device */ if (OpenDevice(DEVICE_NAME, unit, (struct IORequest *)io, 0) != 0) { - printf("Error: Cannot open %s unit %d\r\n", DEVICE_NAME, unit); - printf(" (Is a CF card inserted?)\r\n"); + pout("Error: Cannot open %s unit %d\n", DEVICE_NAME, unit); + pout(" (Is a CF card inserted?)\n"); Cleanup(); return 5; } - printf("Device: %s unit %d\r\n", DEVICE_NAME, unit); + pout("Device: %s unit %d\n", DEVICE_NAME, unit); /* Test unit ready */ if (!DoTestUnitReady()) { - printf("Error: Card not ready\r\n"); + pout("Error: Card not ready\n"); Cleanup(); return 5; } /* Get IDENTIFY data via ATA passthrough (v1.36+) */ if (!DoATAIdentify()) { - printf("Error: IDENTIFY command failed\r\n"); - printf(" (Requires compactflash.device v1.36+)\r\n"); + pout("Error: IDENTIFY command failed\n"); + pout(" (Requires compactflash.device v1.36+)\n"); Cleanup(); return 5; } From 99f03794936bf8f9c367e535a2570b74cfa6f8d5 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 19:44:09 +0200 Subject: [PATCH 13/14] Release 2.0 --- Makefile | 6 +++--- dist/docs/changes.guide | 20 ++++++++++---------- dist/docs/lsptres.guide | 17 +++++++++-------- docs/changes.md | 10 +++++----- extern/ptable | 2 +- src/cfd_automount_version.i | 2 +- src/cfd_version.i | 4 ++-- 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index 746ec52..ac731b8 100644 --- a/Makefile +++ b/Makefile @@ -7,18 +7,18 @@ # Release version: YYYYMMDD package date + optional in-progress suffix # (-dev, -rc1, ...). Empty suffix for a final release. RELEASE_DATE = 20260911 -VERSION_SUFFIX = -dev +VERSION_SUFFIX = # compactflash.device version CFD_MAJOR = 2 CFD_MINOR = 0 -CFD_VERSION_SUFFIX = -dev +CFD_VERSION_SUFFIX = CFD_DATE = 11.09.2026 # compactflash.automount version (optional boot/automount module) AUTOMOUNT_MAJOR = 2 AUTOMOUNT_MINOR = 0 -AUTOMOUNT_VERSION_SUFFIX = -dev +AUTOMOUNT_VERSION_SUFFIX = AUTOMOUNT_DATE = 27.08.2026 # Tool-specific versions diff --git a/dist/docs/changes.guide b/dist/docs/changes.guide index 2183531..f9126cc 100644 --- a/dist/docs/changes.guide +++ b/dist/docs/changes.guide @@ -1,5 +1,5 @@ @database "compactflash.device release notes" -@$VER: compactflash.device release notes guide 20260911-dev (11.09.2026) +@$VER: compactflash.device release notes guide 20260911 (11.09.2026) @author "Generated by md2guide.py v1.6 (14.06.2026)" @(c) "See LICENSE" @font topaz.font 8 @@ -10,7 +10,7 @@ @{b}compactflash.device release notes@{ub} - @{"20260911-dev" link 20260911_dev} + @{"20260911" link 20260911} @{"20260614" link 20260614} @{"20260609" link 20260609} @{"v1.43 (19.05.2026)" link v1_43__19_05_2026_} @@ -32,7 +32,7 @@ @{"20260609" link 20260609} @{"20260614" link 20260614} - @{"20260911-dev" link 20260911_dev} + @{"20260911" link 20260911} @{b}O@{ub} @{"Original CFD History Through v1.33" link Original_CFD_History_Through_v1_33} @{b}V@{ub} @@ -49,18 +49,18 @@ @endnode -@node 20260911_dev "20260911-dev" -@{b}20260911-dev@{ub} +@node 20260911 "20260911" +@{b}20260911@{ub} @{i}Components in this release@{ui}: - * @{fg shine}compactflash.device 2.0-dev (11.09.2026)@{fg text} @{i}(new)@{ui} - * @{fg shine}compactflash.automount 2.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} - * @{fg shine}ptable.library 2.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} + * @{fg shine}compactflash.device 2.0 (11.09.2026)@{fg text} @{i}(new)@{ui} + * @{fg shine}compactflash.automount 2.0 (27.08.2026)@{fg text} @{i}(new)@{ui} + * @{fg shine}ptable.library 2.0 (11.09.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}CFInfo 1.38 (11.09.2026)@{fg text} @{i}(new)@{ui} * @{fg shine}pcmciaspeed 1.36 (02.01.2026)@{fg text} * @{fg shine}pcmciacheck 2.0 (06.08.2026)@{fg text} @{i}(new)@{ui} - * @{fg shine}lsptres 1.0-dev (27.08.2026)@{fg text} @{i}(new)@{ui} + * @{fg shine}lsptres 1.0 (11.09.2026)@{fg text} @{i}(new)@{ui} @{b}New major version of compactflash.device 2.0 driver@{ub} @@ -129,7 +129,7 @@ Documentation-only update (no binaries changed). Release notes and original CFD history are included in @{" docs/changes.guide " link "changes.guide/Main"} document. ---------------------------------------- -@{"<< Prev" link 20260911_dev} @{"Contents" link Main} @{"Next >>" link 20260609} +@{"<< Prev" link 20260911} @{"Contents" link Main} @{"Next >>" link 20260609} @endnode diff --git a/dist/docs/lsptres.guide b/dist/docs/lsptres.guide index ef78d04..7d377a0 100644 --- a/dist/docs/lsptres.guide +++ b/dist/docs/lsptres.guide @@ -1,5 +1,5 @@ @database "lsptres" -@$VER: lsptres guide 1.0-dev (27.08.2026) +@$VER: lsptres guide 1.0 (11.09.2026) @author "Generated by md2guide.py v1.6 (14.06.2026)" @(c) "See LICENSE" @font topaz.font 8 @@ -152,13 +152,14 @@ companion to fat95's @{fg shine}lsfsres@{fg text} , which lists @{fg shine}FileS Verbose (@{fg shine}VERBOSE@{fg text} / @{fg shine}V@{fg text}) appends: - @{b}Column@{ub} @{b}Meaning@{ub} - ------ --------------------------------- - CMD Read command used for the device: - @{fg shine}NSCMD@{fg text} , @{fg shine}TD64@{fg text} , @{fg shine}SCSI@{fg text} or @{fg shine}CMD@{fg text} . - Start Start block (LBA). - Blocks Block count. - Size Size in MB. + @{b}Column@{ub} @{b}Meaning@{ub} + ------ ------------------------------------- + CMD Read command used for the device: + @{fg shine}NSCMD@{fg text} , @{fg shine}TD64@{fg text} , @{fg shine}SCSI@{fg text} or @{fg shine}CMD@{fg text} . + Start Start block (LBA). + Blocks Block count. + Size Size in MiB, or kiB below 1 MiB. Both + are binary: a block is 512 bytes. ---------------------------------------- @{"<< Prev" link Usage} @{"Contents" link Main} @{"Next >>" link Examples} diff --git a/docs/changes.md b/docs/changes.md index 59e1da9..a3ee437 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,15 +1,15 @@ -## 20260911-dev +## 20260911 _Components in this release_: -- `compactflash.device 2.0-dev (11.09.2026)` _(new)_ -- `compactflash.automount 2.0-dev (27.08.2026)` _(new)_ -- `ptable.library 2.0-dev (27.08.2026)` _(new)_ +- `compactflash.device 2.0 (11.09.2026)` _(new)_ +- `compactflash.automount 2.0 (27.08.2026)` _(new)_ +- `ptable.library 2.0 (11.09.2026)` _(new)_ - `CFInfo 1.38 (11.09.2026)` _(new)_ - `pcmciaspeed 1.36 (02.01.2026)` - `pcmciacheck 2.0 (06.08.2026)` _(new)_ -- `lsptres 1.0-dev (27.08.2026)` _(new)_ +- `lsptres 1.0 (11.09.2026)` _(new)_ #### New major version of compactflash.device 2.0 driver diff --git a/extern/ptable b/extern/ptable index fee9475..778c57f 160000 --- a/extern/ptable +++ b/extern/ptable @@ -1 +1 @@ -Subproject commit fee947551d70f70106baffe52556f842f0fddc37 +Subproject commit 778c57f5c21fe81c89cc9ccdee8c3d7ac7dd7a4c diff --git a/src/cfd_automount_version.i b/src/cfd_automount_version.i index 5ddbfe6..d96b8eb 100644 --- a/src/cfd_automount_version.i +++ b/src/cfd_automount_version.i @@ -2,5 +2,5 @@ FILE_VERSION = 2 FILE_REVISION = 0 VERSION_STRING macro - dc.b "compactflash.automount 2.0-dev (27.08.2026)" + dc.b "compactflash.automount 2.0 (27.08.2026)" endm diff --git a/src/cfd_version.i b/src/cfd_version.i index 83efa89..f3d877a 100644 --- a/src/cfd_version.i +++ b/src/cfd_version.i @@ -3,8 +3,8 @@ FILE_VERSION = 2 FILE_REVISION = 0 VERSION_STRING macro ifd __68020__ - dc.b "compactflash.device 2.0-dev (11.09.2026) [68020]" + dc.b "compactflash.device 2.0 (11.09.2026) [68020]" else - dc.b "compactflash.device 2.0-dev (11.09.2026) [68000]" + dc.b "compactflash.device 2.0 (11.09.2026) [68000]" endc endm From 6e28bb1fc4aae5c5af4421cd6b62878020eb49b6 Mon Sep 17 00:00:00 2001 From: Jaroslav Pulchart Date: Fri, 11 Sep 2026 19:44:32 +0200 Subject: [PATCH 14/14] Binaries updated --- dist/c/CFInfo | 4 ++-- dist/c/lsptres | 4 ++-- dist/full/68000/devs/compactflash.device | Bin 14796 -> 14808 bytes dist/full/68000/libs/compactflash.automount | Bin 1068 -> 1064 bytes dist/full/68000/libs/ptable.library | Bin 11900 -> 11868 bytes dist/full/68020/devs/compactflash.device | Bin 14672 -> 14684 bytes dist/full/68020/libs/compactflash.automount | Bin 1068 -> 1064 bytes dist/full/68020/libs/ptable.library | Bin 11852 -> 11820 bytes dist/small/68000/devs/compactflash.device | Bin 10964 -> 10976 bytes dist/small/68000/libs/compactflash.automount | Bin 632 -> 628 bytes dist/small/68000/libs/ptable.library | Bin 9824 -> 9792 bytes dist/small/68020/devs/compactflash.device | Bin 10844 -> 10856 bytes dist/small/68020/libs/compactflash.automount | Bin 632 -> 628 bytes dist/small/68020/libs/ptable.library | Bin 9772 -> 9744 bytes 14 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/c/CFInfo b/dist/c/CFInfo index 0251788..25f509f 100755 --- a/dist/c/CFInfo +++ b/dist/c/CFInfo @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:036f51b0b4310ba43a60db62decb035afabd917aed954500677bb0f45ec5ac49 -size 15564 +oid sha256:27d007dee6f275d3d45d7d4c691a3a3adfc78d8e99ba66ca086c8966ad2dcc3e +size 15992 diff --git a/dist/c/lsptres b/dist/c/lsptres index a71c53e..bc3843b 100755 --- a/dist/c/lsptres +++ b/dist/c/lsptres @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc14f0206f65cdf99b54968fb245c9e5acc00386b957a5b040c45cd36850ada4 -size 11184 +oid sha256:6d3269ebc28e1ea5648aa8c65fdcaf347c0b1d05d14c93d546a3c50a6e1a4f00 +size 11200 diff --git a/dist/full/68000/devs/compactflash.device b/dist/full/68000/devs/compactflash.device index 108a86945b5900950a7be1f2f2a84a0d75718e30..7b1c79ddde29d14cfe8db7042b83f5b46c548037 100644 GIT binary patch delta 2471 zcmYjS4Nz3q6+ZXvLYF75%YuLk?8^!)KMO2i`KwwUAjLH-I5?I`MzYtoY{!rcB3i~W zLYxkbsYz`vI>y?JwSSCB2?Zxj9mioP6`K+UCCLzGM=4_XGe9VD>C4a?oR+RA4Bwk*)6nhWlJ3tT4b75nBawb5S|yRJ z7ghT7Zz&1s>8XxfaY6swH@s^_zbzmrjQl@2R&1AJBelT95|TGHQXm-<8%csMOw}~G zt3lo&v0(9j@K0EtNL|laeAk)vhZ%b;qzw<&Ew~K@S4b(?!EHj%kB` zAk_uOsbsL`m(8s#DrJr(3N|f~ghq}Tnnio)n9=o`W>_j(ic)4Cu6X5Tt!$2h#p95& zkY=|rO)@0;w%~D=YL)>}X+98Qeo8Hd>h8K}ex9+5!Wy&J-Sir?ch@vp(^{bQu4>_r#Jge9(PNy#V`ru(?$Gs^9yF$aQXGK3S|zdkw|9+Lv40=T&X?ubieg1IK}8p@c^Ve8FjIUKE7C z5P zfJ;EDFh%Uhyvu2Fw3bZC^ceF+!H0P#2b5%5Q zKT!IPCtTHL=Fro`$&!Upr@-~~1h2%-dW^MH#|mc{MnsI&lk;S?fz!s$Sn@$Sz?r@5>bBej>))&0Pf>mw$6R6kWodjOx6oOL1qTD2Zt>6G(hj>Z6xw$kT3(O_P zH)pa)5xM1g_Cry>tuF0qt#Q zVIn5_KxkXq_GZ#8rZGRFYA~aCBigce8>g{mH?1To`n3z$11qXzqB-CB^J-IVY@sH< zu+l`)gAuVDT^f4&8_oGMkI}Cm7gaG?lIyT& zjfrCy#I=}jH|4vDp+L%;IsF^UkQyB+QfhZ28D4pjX0iA@=ux<(DbiMKV|-1Kl@uuf z_Q$Z(IgM)m9txBmDDhAx(E}O3-wDj|Ami&Iq2e4y=bb51tjCuuoN4}OH_SM{84YJA z+G8h<2$u-|5ka?Lzilrr)W)yZ5}uM5+7z_c5E}miqy3`YlDXUE?@?1r>KBsl!F`He zIN(v7-hJd_w88B(;q`_E|;BZ_k^z;4Vf4%DS^FKVr-&^hL*Z;N}ca8gF z`}yCWit|xXS)Ok)VhH-#S|A^PuolS2zg!En%2xyV_>-={gbIBc(mHfU3Bq@l)5m7( zOJq!XiOjCExMH_dZ6pGoPDRES7j|f&>s9+tbpik4G?*X^j@Q{kan7-ewFs}{NFoa4 zfVZC9MAz_N-s&)YmsIVO6HsqDEEq8e>zA-T5Dn=mP1nF$RBZ_P9YC=hdLMWUWB1nu z*Xp`oWUU^l&XldPll3S=L#N@b1fB<$178J}pm#z=i-(pqT*DeSEf>La5S~eI3t8R>f6sL!{t{l016Grx@j(TCdYNT!F``MTaT zq~UfEw0@ta>%}~&h+9{UBaw-xLr!PU(KH33PltvoqAdEGkvIcV_r++rUmkFO<*mIApH^?SimTjl4 U*yghB7wx%`2HPxd59t>E2lqN-iU0rr delta 2497 zcmYjT4Nz3q6+ZXv&nzph%en$8%f7D2Lv~lz1qG?GJTQc;f+jev6D#hugzcztHi*`y zJ3<-9F-~iZR~eH!txY;MCB`!1G*jy^HbaFH!}wDvb*Li#ph8enW7Ag({ob;jacAy3 z-}%nD=iYbkIp=Nv_KVvOrX{T>GCUx%t$#=EQeNRSxkepfJ@q-fl^;+w^UGkCgZZ%D z$&UiZz?BFa^Rl_3n7!TjTTT-Vfn2KLF`zT5X8H(n6PQhWGtm2B+920}*~!-d9R%}x z$mL+(;^lbm;w8{`f&T??M&DL^h2Ol*&QmW)3vBLCOw&Xfzx=a%<$CFL+}OSxZ&fJtxb|)7Ljo| z#yTQvvZygGn&z*4eW#ogEL<2U5-rBpp4Z#|Wh^iyWl;QQ^@##&R{Fmu7F3XRc8ttq zTM#1&Hm9m-QhU_;g2XK1RPqm4P-IW%%-Ozg`kRbB7Mktuv>RbdX)DQ2ugh^7o|rsZ#su#=tY8s+L(L@Abny^+6(!QIo*F4CA*it#(LSR z_89Bl@0Y!VwMI}LkH?^QL)SfrFwZRZr>&f^5!zN+k9QL2q_~szqW9N8>2Yoy=KT(u zRW`sQ1Px_3JT4odEd#$ytWD2z1;BNLi6p$kIPmE(Nhpy=e*-=tj;C*M>Ff$U;&2!- z%#cgM4tU^1hOz(IZ?a3`C$rs)u6yYGGCCe{>ZS9b+u}u5EU6>9f#|1HZPdZ(-cC-A zeyojMruxLd?83$#MEM1V6aHrDn~_v_V*b53oZL92(Vqj`8VFX29f{bYRL{yr*kMj- zgAEjFuCw6s+p;KN1z3?RcRM(x;KW!) zn5_SiaZSGj*(#3BsWepptrKH&@>#0z%w5m6iQRMGWoD6{QEj@<>2{xpW*nJ^4c}g- z_m63~{@cNjkCsMgvX>LJfjb5+Q{=cd%si2|tceUy^H^M>ldxoQ)a5n>ISuU>=Ui^K zK@7NDGrmkDUz>h8ckc*GX64M5|8t=|5nG(!Bfg)xL>$kY&rXO7nTs1&g^8j6S#eai z&>f{%z%MO4A0x|;x6l~&Q4Br@Y2}yZVMmV>Osedca-a`FUjz?x+(QP_3nrV>;8S?` zpm#tPMR0i2(!t)q7!UcStcd>Jc1|UO7opCNt1cLEs<(_GoOXl=6_L~puGLpwrrqg| z5^{e4+yihe2we-=FV4F28()ii?23~5g``(VAH1%?S_&^LGPoxkvMfcjyxv3+w2LHU zGZFPl3|o5thUwQ0QQtS+BFO5zkBTIK$~Cs%fYbo<*MW#G!7Iy@r8^-Q#WF zDt}>aoVBLB8riDMTC*Z9XRlZtm#&2TM)j0^e!039e)=!_XH&K~e)l>2!IW>D|9C2H z0>@*=@h8v4`O}Kk#rk5z5cKmzARYfb5lF{(6M?4iR3IHcX?NsQ8}o3FS8vEkcp|<3 zn(29iY`Jfcqv}YQCc9Pbx)+uX*^1|NjEVNcz8@J(H#uD@5YE6)*_e1g@FLqM?gzFn z_>5EU{RRpXoy8~paKQd8QnhP`z+MTsF$1@F?E`3?V$ULfBT~Nikg8qngWL~^YVK{u z+;7(>M-Ateo2~(y6BybDgrgY6mPx$*ztl!+Gz8HXT}9yrH9NdWPcs zwu<5Kc}`z-;#g|}Ro7DpW~lZmrst-^)|v>JDO=S$4BBXdtiGB zHoGWVy4`QLrYpHhP$^bQm5}nPQlo5Eb}G%v0p&gAgmPNxPMt~<$yv@7?~J;1KIvS+y~^dOk5{6F)wQ4 znPx^t>&XF3s*IwO%b3a;=T3gd)NZTkx9;x^uZDCk$6tRpBxWQqFxUZER}$l#fBoh4 sTlar~S3??5?jJ*<4^YlY$zkFNpy;duCg)#&-cH`ctjxG|@-^l#0HNPDnE(I) delta 126 zcmZ3%v4&%UIOi`02IiLx3=F>}D#%Kwc>Mt~<$yvj7?~J;1KIvS+y~@yOk5{6F)xZm zHzl=fbLIi4X=iDF2`SgHzZ~xFfiBwSyvL{ aoPYi0oZQDO&-ilkI%Z|Yjgv1ihXDXR&nm9~ diff --git a/dist/full/68000/libs/ptable.library b/dist/full/68000/libs/ptable.library index f47ff79a937d7b05ba6d5cb2c73f026a007d0755..213814598e9c5454f42df9bd8cc1c16506922ba7 100644 GIT binary patch delta 1981 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 delta 2295 zcmYjS4@}h89sj=H-7)S!JWk*Mf%_HV?%=>XKmi$5eg_gfD^g({*&@BiHqKZzmy>p` zy9hChvx_sV4_jx}hPloAKX8n!9KEH!3Uh;mQ zKkvQod++=H+*D{h)MYhR66t1%5-NWtUv*sLwA`S~v(b=~_wrMUYWNeJt#B@clK2_$ zFuXyLz+CK2QNdp8$mO)u?#ZVX9tOLNS_iNdPAlIJb`DMfumR31ycw(uPBCyRoL6}* zzDIZ!^bzRDsjwl`tOj>#R}U@iYlp4 zm;JF|Pr!O*o3E-(Qw!o3(iiKzoECd!hVK=WIr#meN0*oQuv5|{BNYQEH;IfV#H6k$ zuJF6xdqs8@mu>Wv3yc0+PwU8G{U(F)3`Kv&3!>kclls+CULBdz!W2UZd0~=Jm!znw z6j?AnE3sISAOC$;EY8JqW{K$6d{c_M=a2RFlDtdJt`u!+uetVYuA+=!p~Xdi4@hQ~ z^P*N;|FX%+ZkzJixG9(A#Kf{tjES|17PCiUUy3gCyCuc4C9v_*Acl+ojueW|RVX&Q zs(6v&EsG?1(~9Tm0m?%0yl&Vs&o-hIig4oY#1sAmw-lSNO*7!zrP@9fQ;B;M)1Pu{ z;qH(4EZ=7AqBy_q`7I9|b#$zHp1L>eqy$B^CT*xAi(?1<1m49}&$Q|thc~?Hk?R1ILZHnwqTEo6JINrHSeR5kIO-^%PYTfC}pSmZv_fq^bbvn-K&XI@c+#B)@3*5-daHr#PxV04 ze+E7+x#%A>71}xTnnR(-h&u*%EXe*Jaad8m(8C)5nt_)@cgnLRkHCUKGP_8d$3;bb z2%K$^UG$jKf)g5}%+^C|xDVx|&|7z|<(%$6k|p%Pai1*~E!OR>^YGr*yxCjm_dBRA zSqC)^^&ZqQSsQ-{Y)Fh*-I?flzs64_VGT>*<$jX%;C}-z5b3FVGvUsRY7uAdAx124 z&~E`lMrJVo)R)-Z*VAl83)zHp^#qc%vp?4q>%yj&wh`Sz@IFOdNJn!7vEVMvdaz4d zMMGLy#|s!HA2mH_A0vG|kb;&*PWP}3TMhWHz|Xc5Y9)3$kPxI0tDa}woUD)9$#<*` z(@7r6p+IV*7h`Qw)cHyDK#DReIA!(v_1@pIctxH29PS>(!wl~EI3<3-iOGI4{l|`7 zdKYG?FsJV_G;sRYv}jE)VNUTz`d2JPbggeRU^k{)#QpWBH}rA(=dgD5<6Z?D@D<_*NYYwKP~6WdYrMG`o5(hsEoRq z&MM!J+swh7YSna5G-cip&a7N^R@7&0UNh_`hKI_81m5|*=*qHo^x&)%N*ge%eHaxB zy>m(~l$_8wsc}WnN24udIJI!>a1Njap2_J_V0i#3iA#lx^xtXs6-qe)ZB1sV8mQc; z%7iLK3Hy-301+N$;|O$iMnP@0Iz1R9?TWyhg_(ebO#vH(*H*IQMzqC&ASs_o+C};+ zT7AOl_5fO)051A{v0LzlO?FZMcigxL?`@Q6e=*b$SXVSczWBhl-gpSTD&h44*AV?lrz}} zDIxzLS?W*YB#bEPLe7L!ckZW#CaD9;%6bz;`0=6jd9TB<`11 zJFs~lrOH-Le@2s!nzL;_hO=|U%@p-Iwtr+XTGuM}l$9AyLJx>jWhEVNf*mUhGtv$F zGtlyn&>`)fUB~oC_65n~qJ^?5-LM-AypCHs(xiDhENS$8s4m%7|1xT_z$=0bnLG|< zfGUW-tG6(pmZ*QIZpM#=Ke>X0wRjd8d7C|hqN=Mt~<$yv@7?~J;1KIvS+y~^dOk5{6F)wQ4 znPx^t>&XF3s*IwO%b3a;=T3gd)NZTkx9;x^uZDCk$6tRpBxWQqFxUZER}$l#fBoh4 sTlar~S3??5?jJ*<4^YlY$zkFNpy;duCg)#&-cH`ctjxG|@-^l#0HNPDnE(I) delta 126 zcmZ3%v4&%UIOi`02IiLx3=F>}D#%Kwc>Mt~<$yvj7?~J;1KIvS+y~@yOk5{6F)xZm zHzl=fbLIi4X=iDF2`SgHzZ~xFfiBwSyvL{ aoPYi0oZQDO&-ilkI%Z|Yjgv1ihXDXR&nm9~ diff --git a/dist/full/68020/libs/ptable.library b/dist/full/68020/libs/ptable.library index 48d702aa75392165d3b4036c5d53dd53ef919a69..b4aaa819281fdc06ade1ce3f12bf26d97e4f50b6 100644 GIT binary patch delta 2068 zcmY*aeN0nV6hHU1K*fTkOkkzLYbj9LN2$vEB-&0KtO8;o4wdM8PFkaGBSa0ssuj^; zml^ajV~jJK*&i$t!eCp7YZ|g_({0WeH=SX1>H<qH8MA;dLun+lq)`8%-psB%?Qn ze8mts{X^zZXN`(p0n|GM(0(F7)>Q8@`5GnpoVKYJ?{8Ed$J!pdK=yWx?~5O|fXu~e z#Dt;NYyDsRxEW+?`H(#f%FjgEQR6dcax_NS$!2GZqvaitE$Z`Qg*NnASou(^z6b~q zuDYTtx&%=`mS(awfr!flInA_}jqUgMW0Kq2?N^F|OC<&PX?2oO>-U2!I<*-X9~(Q= zTIqd`#Wd2BNvnyGhLYyjO)0%t_oy34izGcl>5L?WP->T?VU&E5G=|bi9>@}ri1cxq zOaA52Xq1iD#||C2a-jRY%|OnwFEPG$E& ztR+@I_>vm7YQKbfg+K@Aws~wK3FDEz!i}Ket3}r&ewzW1rq2GN#N`= zk{f&n8^6}u@5i1@7;HRDtuFw3r+2*$7XjgLn z3~(Mg-%E#bsok|1yI#}R}TU__=Aq5ES!y#_}E%@ixAwF zVteHNN2s%OQL1j~PKVc}VRwK^+4fphX|XFY#|SC`{!H^9bTj;woS2>an}C%$alGI` z6}A>aoQ#zr@)FvfS`f2FfU!1uF}1Kd;SP#xMUvGIqh7;m5mbN)iwAhNblB^)M-m1w zqVRb{NkmnO5j`Gaf=1{&v<0WSe*#n`V>lPd0;o*1GA%!Ol>m>fi+y>#(H;rEiP}Zl zmbQ+J&~VxX!qT3XKOjC@syV?V4AR@0*U2_&N-rmt-p2F<60;jX>!UvHIkJ&1n4=>V zv}R7$>NGqr4ufrF81y+#L$agUUDS6D)UJ8#c1YB(5MZVPBMd4tq${wSZiV6;-XiI| z8Z{Ye_a#k^an_ty`2Y>h$t7p0JYym8(4q{F`kunHsURMYa@)%Lut=N&)(&6Rv_Ti?*eo04Jb8^U}z}^2^X$A%~?s$9T z&LFku3X(1ea8F^EV8dGk2#4w0y7Z(^1qcP7T9Ggupr>@J%p1_^ownW!vMW(*$SKAl zXV|#1TV)f^Ib%*xm3}XIK#%H|Ce;Wqe0n-7G>&Zh=zu;qNsZPmPp$oEeT{bN(x@pb zS640GKG6C?KLHvAn5>aJTWLeq{KYmLHCzRAO@O<7e2Vj3TpeqV$b6`GOydq;#y$h~ z86Z}G7_qkyZK0!Cv&}7-Ef>4Q?Epn%d_!zS*QBd~^myyAt~;GoEv^y7K95*s)N07f zEktHDYX+-Z$(8GEC>7#8X~CH57$bkmXQIaqA13rv9dw255z;Qekdqc=SE`19Wl(9b zM{d3^z~ET#>Fl={vX{miza>t3#kgM0l_Q)-zY5=Se0H;|s44H`*MkDw?i5E{XqT2= zY_th5CAPsRz<~Jgpb%i>7Yp#}=|l14d(3DOGsLZ*D&raP``c0ak|{SvhrS|eGij{9 zYDB`x8+kU6yRCS(JY2Z|Hxp6Ebz-Lj2puoL-zO}XK6#n?Oa(Ck0d56o!1Qu{_p@w8 zJ*A&Z52xTWMH+Q-eo_jOK}eHAfPY>A>n+)sSt>2Wq&2!GWci8N#7IJr-X zs5U=~ETFdhh1pJw2WY?yBg8?v+p?3`BmWEv5DZH!IMcr;($o3&blj!jssC&@1AHu^ ZLbO(Z2v5iJOA>h4s%Auq_r{sqr;zdir} delta 2064 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 b%7AA5yna!?qF>W*>IE{Ds*?mR6K(zjbrANw diff --git a/dist/small/68000/libs/compactflash.automount b/dist/small/68000/libs/compactflash.automount index 5681a74e1fe420d444952213713af8ae68afa1ed..8538e3c532bbf8bf2767e3abf9527b8f4e146dde 100644 GIT binary patch delta 122 zcmeyt@`YuBIA;$71M^D;28N!A3bN9_y#4^0atsVi28>J$zkzIjAns#eV4OE`o!G>@ zsEKD}85d4`rOH@6S%9&O=|A)24#rCUxqj>Z-tcNjV_?v5{`IeavH+8~csWEYoq<6{ T%^@h8L7{*FDCaxbj>!rD$1o>^ delta 145 zcmeyu@`Gi9IA<>d1M^D;28P~=3bNAwy#4^0atsViCX7rBzkzIjAns#eU|ckDo!G>@ zC>Gt6)Ut^uWEtm9e5T4+KADHHjOpM1$t{ePwln?K{k`GUkjB8E;r#1gx8J(|3%nZA n85m5I944Ls@@5q<0mX|Us(|7$Y7Rl!3!ka~nvCgi*D{KLJ1sxDXMN%w*f>T}W@;?qvnj#lrdXJ>I3e!xnoB zjVVueA^|U!A&BoWZa-unb<{a7JJ&hC*?siQ8P=+k@l<~#WDtF2x*kP_qDa?t*ph?6VA%sQUa8GsQxg_=6 zpR$^z@&hRgJK}~23BDf!+oW0#$m&w95wfTz2MgG9ROi5~00&dp$%=emg3Bu<}VsNSwd1<~p%Og!4Bl+Mruj72|e z1nxPKevRruoL4FTi5K(ZVjD^n2LGuG9UFjwb}UmVa9W{2^hF9B3d8#%$u58O~zHZl;SdQ3Qd65{J5V51@sjZ=$>R}98L;b6D2B~$%?a*3~>k(p!-ess3032{?@ z+ll@tgwX76H@#Pr*YO z@teFf_bqmrf00{c=_~NTt^W=hOBu3*ACsC28BZ?pk=$Abd#KWcpQccY4@e~Kyc((I zjkbj^7gDJNNvDF1RD4kJ0i6ut4iy}UzNgYeH}s)o+BUbmi4WOwNy4~ou4Mz|QWob8 z8Qhf)A6biNi5^}(>vJ~7M`wM-Zu36z2X>A(+Si%fl@x4qtfH@$-d1rHkJ-P>+ek?= zWnAA$e?9F_x(AY=>_og}>VLz^yB&+?omTLZS7!U54SA`9+uW5h{y0WHiJ*mz5*ep~ nEA1N1U(c>_gKL3Et^E&@2%tkUOfbU=2^%fvEf;AFnz4TYW5FAP delta 1825 zcmZuxe@t6d6h8O0bfqb*gHg((z~fO$fv(n$0ODjFu#R+4E1O6*4ewQGi90#N)45I@ugo=*2F04M>>T#$*^BhJLJ6^C%NJg;&~Q*#$*ag^BX zr8bA%QJl~1FD|v)?JsH20t#@nNdSMtu^8B)9O~d}h-T05YQBrVZt5`29sT%)JeOy3 zEzuneXgOzPG^=!K2{ZviWfX+_>pE#Y#!{Z#CAX=Osoc~pS&OhSDniJorBBu8Y-%Fczi$6_%~!>bmL%pVNB;{y`p;xPVBHE^4r3x*Ch z19{DR#61{L@fY_D`lABG_R8!AiQOmDA0bFWGN}v=t&$XnQr;n%Vz#m<1hLKX%wS{3 z`wsxo%?@BN8g9e7TkjER7or?%w#4p?NoCcB4*39<`1tQbYQP{ap>{~t?t3T>=Xzk9 zB=3^x;a(`0<>8bh4-=2cA8!Nu;|_)%I#>`UI8A*p62{`Jnw$cx`2>I#S=qOq#F}?5 z3^D52m>G`MU-9bOg zwSrDN;@VSPMhY1G9UuLNIMra0(G_jM1v(SF_#~ z;U3dN3gAtcKHOyEl#x}??OMTxC5w>IMdy=ynK+={&EJwDYDjsHjMK@K_lcXj^t;I% z9o5&8(W%S&1QPcnKlFPfY?mw`9enUdZ80nhYFNb*;4 z2OyEJ6hYmJ7R97=o46FYJq;ODUMjH8r z7H7PST{@Ogm^z;41grWhP^4BudfnT|trp?$@908C1J4*_5B(3~m-__Jj#16YJ3d;U zxpfylK7K|}$z&e;1lT74!~gY$S;gK!Z1_Q7oE6jo4ffnB_R!hP3^GF(GPmTrQC-T^ z9?)8Ac_*SG%-8l`MapG;NY2vPtk21pw3YjYj8aGTK02QLX^wQl3?f`^$FEw1-&brP zFj806de^^KfVS`@&XeQ>4ds-O7P^#EOG;_6sff9`N?T2>%&L-JG#RDO z9aA8~p)C|lAr9txx19@L`1AbvJyj43|hHPWUm z)a`K&+~jQNQm{Cw;Bc6XD4h($lBdci&0dQ>+W2yrhN`YILn@maSZiZ&H@R;KIuAjm zJp{&6;7q^{)o*7)wxUg7B~^tbs9z7=8W4lKpdxWLsB?tXRSfG$trrcni$$YklkL?l zAEQ1>IiWMV2bqH%vcz?bpSJrU-jsm(l2%Z=MSY;e4|;nG%uu!@u||naQ??>8m&9&+ zuER!tjDFKQv^(1IJSp;^E2WB1%3y6xESW^VTijo@`>~GR&`+z!-ii%_SxpHcmV>BV z{4&ul9(*Q~Dgl2AwYgsrjfB$_TQo;jcv}w(Q8jytzLqNja4!rn#)F3ALElIGn)Bzb z3lcsHsZgduE7;5-k8Y%vnWjmDqkuK1ejSkQ{Riij+%W(E delta 898 zcmYk2T}YE*6vxkbr*qCV=ewC7&x++o^J{90a+sNWbuu--%|ysHGZ!UcLnTB~gbch8 z^|6Q$>Ox8^y6~lt5DW66g1`)<3l-_2tc6sV#EY?>ZSRE-9L}HLInV!`=hsp{l!l7XZQl(su_qMJ&??S=d)l{zi}3yaX3VuE8NJ7@nL7Vs9~2%m;qCzWL&4c%J-Rd z$BMw%Y2hq7WU9mMm1tfWHWL*Kwqe9`vtQT28(?#kz4^oMgJH&=$V`yg5Mzrn zv&n2kxB{zjee7e$S@n9=Q@`Yfn8PeCG0LGWug~vCr(N3qWOiaco6y0sV6MQz&hTQN zI2?r-F~2lWDgD`?;~Eh+#nOEr5ckvg=z}I5B*Ci!c;L~hGTF0^w*%a90o-syw8jm5 z8*Pj}b<))ZtjghSkG2!MSnR_IH|Q6-pnR}h#k#^$z@w`d*j=L=5_E1z!C?Mwm)J5h{0Y28zwpak)ipY&PsOWrU2n%M zYBJ>EHf=H-z!kB_ppWQx)Rfk!5c~f8FErtE4(VFbt5H{*#TECXupHK*!2PAssRb=tH7l3|HbZbtXBm zgN`J<#%ZxGxhx!8#L2Y#Xqkj5(o9;(W#T2hWRQ%Id*mURB@5&oSs|av7LklfBOjQr G`28O=t>TOT diff --git a/dist/small/68020/libs/compactflash.automount b/dist/small/68020/libs/compactflash.automount index 5681a74e1fe420d444952213713af8ae68afa1ed..8538e3c532bbf8bf2767e3abf9527b8f4e146dde 100644 GIT binary patch delta 122 zcmeyt@`YuBIA;$71M^D;28N!A3bN9_y#4^0atsVi28>J$zkzIjAns#eV4OE`o!G>@ zsEKD}85d4`rOH@6S%9&O=|A)24#rCUxqj>Z-tcNjV_?v5{`IeavH+8~csWEYoq<6{ T%^@h8L7{*FDCaxbj>!rD$1o>^ delta 145 zcmeyu@`Gi9IA<>d1M^D;28P~=3bNAwy#4^0atsViCX7rBzkzIjAns#eU|ckDo!G>@ zC>Gt6)Ut^uWEtm9e5T4+KADHHjOpM1$t{ePwln?K{k`GUkjB8E;r#1gx8J(|3%nZA n85m5I944Ls@@5q<0mX|Us(|7$Y7Rl!3Rg;FcJp@v}@(4AA&nZ2*cp0P40dR3Gp?1pp;L-b92`XCk)XSc7Bl(X#xd)VX@K+q3>? z*l2CVIqB(1Ccy(`5P)xB&br?k=L`5@yVD*ydUBWEa<}?SLg$NwwA5QZXSv37#7Hd6 zLH;4980E^BnG429EyF|2&9)T!TJxVfG&S65 za(=hV>4HklVcE-3lf#*Od|c|Hwh3T1_Ff~veO~=@ zOa(i8f>*mxVB|#s_^AU*B?+ID0>(R`OqPHzB?*YVC;^{^!SkX>zbw+bC~`$ONj1A7 z<8kcCQ@dAy#BKqgSSizTv0t#!CS zfG{nD$8!517O&V;3qhSUBf?BGyJXr!e9WD5t3g8>_=f5O(l4O$_Qv8)Y?ESAx+O6F ztZrwTFN$_dJTK1=XG+y7fD0*cLyl<+fdi9_dvR8Q$`KLfc{#S7?KiK?C>0E-Y<>r5 z1>V6H+2dp*W;-Y7*@QWx$WNF0Z}^`+SAz8K0HXX~36DfbOfo}mBX>v1+H(tygZW-? zslEn)vOnpezMzl{g~Z%`v81vFrQOfZ1}&BjlSLpTSD*?$2Ws~YM6 delta 1791 zcmZux4@?tR82{e2*3uQMAf=Q7*Q3+|wRY72Bg|Ec$gp&*GD7Ay?i!#*nQMrcMHy6v z3|V53x3R?#V~lZT64Q;j7}6Nxm`ju`#%0T57XNHxGBg{q&AATSeeYDZxLxw@e&2iV z_xt|6cLUxL??A@#-2jT80Frixz}H?q4**Jl{99ozNsl-O$0{7+fi=rLE1H^j@-|nA z!&&NZIbFpC{O00Pr_1@G26sRqjt~R*^d}PFgf-xY35c2d%wG!?Le#R(a`3>>dRwmE zcQT$*9S&-FwOue%tHtTHGobx|VOvAL#b`C! z6z_KXd#Zb00fqi_6hn67nwE}h(;vH2=-vfPha02Uw7KNqV6x4`tET#D!;vWH00O`T z>~+4Ai8Ay8Ts^Hweuk*%Tgj`sV%jjqG8+UEkkM^K9Wt6m)Fz`Fh_=XR4$)2#h>Lk6 zLw4h2^r=K5!D|H7)V_;*B5wwOg!x5NeL}k$_@&Q=BYT>GY_Hu{-5XR1mpApc#6(Ec z$?OKk?vm;MA}}GDRE8VvOo~UT+CG_LwHr|g63b-E;4mKQ-UdW>rU!%3@Qd%et=-2~ zA;uf6w#3~bRw`}e^#H)Mko09l4H(1~)Q-s7T?^uHz5~jce5Fi}cETE29zJC9F!G4} za0r}_I_O()@U1w)YwE+}Q7q29#VtZSAOdWWl>_&ah}TX=Awj)M3X%l>-m#u$h#N;c zmwe8V{nVS9pME(AQ0ecDviNn)=RzRC?K;|<`dntbI^1I9TS2ECsN7Ul(UM}dflh+o zL-e;)GoC+v+RM2E63oXsNFlrmr}s8Fc;)y!=r+t@Q_>_zZlg!ix=5S~%RVD6INM=x01>t{f) z`YmbI-9g{!6Oh_c!Eb{U!6SisEAA-P6+xC7;}5FUC-9bLi59dJXx)@8y}bs{WQVX3 z-%1=i`Hjd7Ti1yr-m6}duf0t#a&3IojdG`j*uZKB?Jn{W7KHMdNo0-|W|pvEGhbVJ zzOZqn25-#3`kPQH!OtmlHgnYM!$RQ|=ZoO3+zE(8E7#UROA4EjVD=?CVcbmIl+U`} zXy+S+MqfMor&Qf|%GHVGR;t)-fin;Dw53(|pnXyrljjfXS#}EGf=cY|ptcA&Fv_?W zXBFtVQ-XVfymto`O$F&?Vk&wzwEf;w< z8Rq{9Na3QlOqt|Is>%*<)AMv|c2UNm;{1|$S%4c zCLlKopbf*Clve`OnzL#H{uEj`Q6-ZFY!qOl01W@v94>~ELUexYp)U9h*o39j{i#1*_>hS`#W@h?)%);o3xDoluQhopQo+n z_wtyCL4s>X@vD~Lmpcv+Io6nX=l$<>7cCY_R(`=`?|oC?24&ER_oBmIBf)oP(Z(Qf zHy~dlL9E=txH>v4Jh@`W0!JMJPwa|+!B%2*h8{3(F~+@PRF$`$tfSt%$H`&ZnO8!# z(2w(KNGVlXR&%%Gw9L}V%`53~i-~>CS{LN&RM)O@f-i$vW2?;9DKq~0L2u;wMF_du-=Rh&{H!0&g%m4rY