Compare commits

...

14 Commits

Author SHA1 Message Date
michaelangel007 c9540e3524 Cleanup 2023-04-06 19:39:52 -07:00
michaelangel007 eb4a94c1ad Workaround GitHub markdown bug adding line separator 2023-04-06 19:32:34 -07:00
michaelangel007 9cd97ba55d Clarify default for cat and order of arguments for init 2023-04-06 19:30:41 -07:00
michaelangel007 c3771eed99 Add Windows build instructions 2023-04-06 19:21:04 -07:00
michaelangel007 5ec0c84a73 Update example output 2023-04-06 19:20:49 -07:00
michaelangel007 528c6e9998 Fix readme to refer to proper utility name 2023-04-06 19:18:56 -07:00
michaelangel007 a29a8b0215 Cleanup readme 2023-04-06 19:15:45 -07:00
michaelangel007 05c790532f Display usage instead of having only a volume name; i.e. --help 2023-04-06 19:15:11 -07:00
michaelangel007 7395ff335c Add debug log for file access 2023-04-06 19:13:52 -07:00
michaelangel007 973c2e0d2f Cleanup usage examples 2023-04-06 19:13:39 -07:00
michaelangel007 ac9487c04f Default all files to Access Can destroy/rename/write/read 2023-04-06 19:12:49 -07:00
michaelangel007 44522562ba Add create test disk batch file 2023-04-06 19:12:06 -07:00
michaelangel007 d76a6175ab Include, but don't compile, helper source files (since there is only 1 source file to compile which automatically includes them.) 2023-04-06 18:36:44 -07:00
michaelangel007 24825f9dc2 Build prodosfs on Windows to match macOS 2023-04-06 18:35:48 -07:00
5 changed files with 148 additions and 38 deletions

View File

@ -0,0 +1,15 @@
echo.>foo1.txt
echo.>foo2.txt
echo.>foo3.txt
REM Windows
echo a020a90220a8fc8d30c0a92420a8fc8d30c088d0ed60 > softbeep.hex
certutil.exe -f -v -decodehex softbeep.hex softbeep.bin
REM Windows
prodosfs test.dsk init -size=140 /TEST
prodosfs test.dsk cp foo1.txt /
prodosfs test.dsk cp foo2.txt /
prodosfs test.dsk cp foo3.txt /
prodosfs test.dsk cp -aux=$0300 softbeep.bin /
prodosfs test.dsk catalog

View File

@ -24,6 +24,7 @@
<ProjectGuid>{8c7d2412-52c5-4c68-9e93-5718cd84f857}</ProjectGuid>
<RootNamespace>prodos</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>prodosfs</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@ -141,7 +142,34 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\generic.disk.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\prodos.cpp" />
<ClCompile Include="..\prodos.tools.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\prodos.utils.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\string.utils.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\itoa.comma.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

118
README.md
View File

@ -1,5 +1,7 @@
# Apple 2 ProDOS (Virtual Disk) Utilities
`ProdosFS` is a command-line utility to create and manipulate virtual ProDOS volume images for emulators.
**NOTE:** This is still a work-in-progress.
Commands that work:
@ -21,14 +23,14 @@ Usage: <dsk> <command> [<options>] [<path>]
cat Catalog (short form)
[<path>] Path of virtual sub-directory to view
Defaults to: /
NOTE: Defaults to: /
catalog Catalog (long form)
[<path>] Path of virtual sub-directory to view
Defaults to: /
cp Add file(s) to volume
<path> Destination virutal sub-directory to add to
There is no default -- it must be specified
NOTE: Defaults to: /
cp Add file(s) to volume File type will auto-detected based on filename extension.
i.e. BAS, BIN, FNT, TXT,SYS, etc.
-access=$## Set access flags
NOTE: Defaults to $C3
$80 Volume/file can be destroyed
$40 Volume/file can be renamed
$20 Volume/file changed since last backup
@ -47,6 +49,9 @@ Usage: <dsk> <command> [<options>] [<path>]
-type=$## Force file type to one of the 256 types
-moddate=MM/DD/YY Set last modified date to specified date
-modtime=HH:MM Set last modified date to specified time
<path> Destination virutal sub-directory to add to
There is no default -- it must be specified
NOTE: Options must come first
dir Catalog (long form)
This is an alias for 'catalog'
get Extract file from volume
@ -56,10 +61,11 @@ Usage: <dsk> <command> [<options>] [<path>]
To delete a file see ........: rm
To delete a sub-directory see: rmdir
init Format disk
<path> Name of virtual volume.
-size=140 Format 140 KB (5 1/4")
-size=800 Format 800 KB (3 1/2")
-size=32 Format 32 MB (Hard Disk)
<path> Name of virtual volume. You MUST specify this.
NOTE: Options must come first
ls Catalog (file names only)
[<path>] Path to sub-directory to view
Defaults to: /
@ -92,44 +98,92 @@ e.g.
Three different disk sizes are accepted for init
prodos test.dsk init -size=140 # 5 1/4" (140 KB)
prodos test.dsk init -size=800 # 3 1/2" (800 KB)
prodos test.dsk init -size=32 #HardDisk ( 32 MB)
prodosfs test.dsk init -size=140 /TEST514 # 5 1/4" (140 KB)
prodosfs test.dsk init -size=800 /TEST312 # 3 1/2" (800 KB)
prodosfs test.dsk init -size=32 /TEST32M #HardDisk ( 32 MB)
Examples:
prodos test.dsk ls
prodos test.dsk cat
prodos test.dsk cp foo1 foo2 /
prodos test.dsk mkdir bar
prodos test.dsk cp foo2 /bar
prodos test.dsk get /bar/foo2
prodos test.dsk rm /bar/foo2
prodos test.dsk rmdir /bar
prodos test.dsk init /TEST
prodos b140.dsk init -size=140 /BLANK140
prodos b800.dsk init -size=800 /BLANK800
prodos b032.dsk init -size=32 /BLANK32
prodosfs test.dsk init /TEST
prodosfs test.dsk ls
prodosfs test.dsk cat
prodosfs test.dsk cp foo1 foo2 /
prodosfs test.dsk mkdir bar
prodosfs test.dsk cp foo2 /bar
prodosfs test.dsk get /bar/foo2
prodosfs test.dsk rm /bar/foo2
prodosfs test.dsk rmdir /bar
prodosfs b140.dsk init -size=140 /BLANK140
prodosfs b800.dsk init -size=800 /BLANK800
prodosfs b032.dsk init -size=32 /BLANK32
```
Example output:
Given these steps ...
```
dnb??iwr /TEST Blocks Size Type Aux Kind iNode Dir Ver Min Create Time Modified Time
-------- ---------------- ------ ------- ------- ----- ----- ----- ----- --- --- --------- ------ --------- ------
-------- *FOO1.TXT 1 $000002 TXT $04 $0000 sed 1 @0007 @0002 0.0 v00 6-NOV-17 <NO DATE>
-------- *FOO2.TXT 1 $000002 TXT $04 $0000 sed 1 @0008 @0002 0.0 v00 6-NOV-17 <NO DATE>
-------- *FOO3.TXT 1 $000002 TXT $04 $0000 sed 1 @0009 @0002 0.0 v00 6-NOV-17 <NO DATE>
-------- *TEXT.BIN 3 $000264 BIN $06 $0000 sap 2 @000A @0002 0.0 v00 6-NOV-17 <NO DATE>
========
echo. > foo1.txt
echo. > foo2.txt
echo. > foo3.txt
REM Windows
echo a020a90220a8fc8d30c0a92420a8fc8d30c088d0ed60 > softbeep.hex
certutil.exe -f -v -decodehex softbeep.hex softbeep.bin
REM Windows
prodosfs test.dsk init -size=140 /TEST
prodosfs test.dsk cp foo1.txt /
prodosfs test.dsk cp foo2.txt /
prodosfs test.dsk cp foo3.txt /
prodosfs test.dsk cp -aux=$0300 softbeep.bin /
prodosfs test.dsk catalog
```
... it will produce this output:
```
Acc dnb??iwr /TEST Blocks Size Type Aux Kind iNode Dir Ver Min Create Time Modified Time
--- -------- ---------------- ------ ------- ------- ----- ----- ----- ----- --- --- --------- ------ --------- ------
$C3 dn----wr FOO1.TXT 1 $000002 TXT $04 $0000 sed 1 @0007 @0002 0.0 v00 6-APR-23 <NO DATE>
$C3 dn----wr FOO2.TXT 1 $000002 TXT $04 $0000 sed 1 @0008 @0002 0.0 v00 6-APR-23 <NO DATE>
$C3 dn----wr FOO3.TXT 1 $000002 TXT $04 $0000 sed 1 @0009 @0002 0.0 v00 6-APR-23 <NO DATE>
$C3 dn----wr SOFTBEEP.BIN 1 $000016 BIN $06 $0300 sed 1 @000A @0002 0.0 v00 6-APR-23 <NO DATE>
===============
Files: 4 / 52 ( 7.69%)
Blocks:
Free: 267 (95.36%), 1st: @ $000D = 13
Used: 13 ( 4.64%)
Blocks:
Free: 269 (96.07%), 1st: @ $000B = 11
Used: 11 ( 3.93%)
Total: 280
```
# Building / Compiling
* MacOS
`make clean; make`
Windows:
Start Microsoft Visual Studio 2019 and open `MSVC2019\prodos.sln`.
# Soft Beep
```as
ORG $300
SoftBeep LDY #$20
SoftCycle LDA #$02 ;+
JSR Wait
STA Squeeker
LDA #$24
JSR Wait
STA Squeeker
DEY
BNE SoftCycle ;^ $0904
```
Converted to ASCII hex dump
```
certutil -encodehex -f softbeep softbeep.hex 12
```

View File

@ -85,9 +85,10 @@ Is this still needed?
" [<path>] Path of virtual sub-directory to view\n"
" Defaults to: /\n"
,// FILE_ADD
" <path> Destination virutal sub-directory to add to\n"
" There is no default -- it must be specified\n"
" File type will auto-detected based on filename extension.\n"
" i.e. BAS, BIN, FNT, TXT,SYS, etc.\n"
" -access=$## Set access flags\n"
" NOTE: Defaults to $C3"
" $80 Volume/file can be destroyed\n"
" $40 Volume/file can be renamed\n"
" $20 Volume/file changed since last backup\n"
@ -109,6 +110,9 @@ Is this still needed?
" The file type is auto-detected via extension\n"
" -moddate=MM/DD/YY Set last modified date to specified date\n"
" -modtime=HH:MM Set last modified date to specified time\n"
" <path> Destination virutal sub-directory to add to\n"
" There is no default -- it must be specified\n"
" NOTE: Options must come first\n"
, //CAT_LONG2
" This is an alias for 'catalog'\n"
,// FILE_GET
@ -187,9 +191,9 @@ int usage()
"\n"
"Three different disk sizes are accepted for init\n"
"\n"
" prodosfs test.dsk init -size=140 # 5 1/4\" (140 KB)\n"
" prodosfs test.dsk init -size=800 # 3 1/2\" (800 KB)\n"
" prodosfs test.dsk init -size=32 #HardDisk ( 32 MB)\n"
" prodosfs test.dsk init -size=140 /TEST514 # 5 1/4\" (140 KB)\n"
" prodosfs test.dsk init -size=800 /TEST312 # 3 1/2\" (800 KB)\n"
" prodosfs test.dsk init -size=32 /TEST32M #HardDisk ( 32 MB)\n"
"\n"
"Examples:\n"
"\n"
@ -500,6 +504,7 @@ bool doCopy( ProDOS_FileHeader_t *entry, const char *filename )
}
#if DEBUG_MAIN
printf( "File Access: $%02X\n", gEntry.access );
#endif
bool bStatus = ProDOS_FileAdd( gpPath, pSrcFileName, &gEntry );
@ -803,7 +808,7 @@ int main( const int nArg, const char *aArg[] )
break;
default:
if( nArg < 2 )
if( (nArg < 2) || !pCommand )
return usage();
else
return printf( "ERROR: Unknown command: %s\n", pCommand );

View File

@ -279,6 +279,14 @@ if( block == PRODOS_ROOT_BLOCK )
void prodos_InitFileHeader( ProDOS_FileHeader_t *entry )
{
memset( entry, 0, sizeof( ProDOS_FileHeader_t ) );
// Default ot Read/Write/Rename/Destroy
entry->access = 0
| ACCESS_D
| ACCESS_N
| ACCESS_W
| ACCESS_R
;
}
// Globals ________________________________________________________________