mirror of https://github.com/fadden/nulib2.git
Transfer nulib.com web site to github
The full site, in all its FrontPage-generated glory.
This commit is contained in:
commit
eceb8f7038
|
@ -0,0 +1,2 @@
|
|||
The gh-pages branch contains the NuLib2 web site. This is accessible as
|
||||
https://fadden.github.io/nulib2/, or http://nulib.com/.
|
|
@ -0,0 +1,23 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|06 Feb 2000 09:07:24 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_nexttolasttimemodified:TR|06 Feb 2000 09:06:47 -0000
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|23 Dec 1999 21:42:47 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_filesize:IR|825
|
||||
vti_title:SR|Shared Top Border
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_backlinkinfo:VX|
|
||||
vti_cacheddtm:TX|06 Feb 2000 08:07:24 -0000
|
||||
vti_cachedlinkinfo:VX|
|
||||
vti_cachedsvcrellinks:VX|
|
||||
vti_cachedtitle:SR|Shared Top Border
|
||||
vti_cachedbodystyle:SR|<body>
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|false
|
||||
vti_botnavbits:SW|SHUB
|
|
@ -0,0 +1,21 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<title>Shared Top Border</title>
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<meta name="Microsoft Border" content="none">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<p align="center"><font size="6"><strong><!--webbot bot="Navigation"
|
||||
s-type="banner" s-rendering="graphics" S-Orientation B-Include-Home B-Include-Up U-Page S-Target startspan --><!--webbot bot="Navigation" endspan i-checksum="0" --></strong></font><br>
|
||||
<!--webbot bot="Navigation" s-type="siblings" s-orientation="horizontal"
|
||||
s-rendering="graphics" b-include-home="TRUE" b-include-up="TRUE" U-Page S-Target startspan --><!--webbot bot="Navigation" endspan i-checksum="0" --></p>
|
||||
<hr>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_timecreated:TR|15 Jan 2000 06:19:33 -0000
|
||||
vti_timelastmodified:TR|31 Mar 2004 17:37:51 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_filesize:IR|3954
|
||||
vti_title:SR|Bugs & Features
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Language en-us HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.8912
|
||||
vti_backlinkinfo:VX|index.htm bugs.htm
|
||||
vti_nexttolasttimemodified:TR|19 Mar 2003 17:33:03 -0000
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_cacheddtm:TX|31 Mar 2004 16:37:52 -0000
|
||||
vti_cachedlinkinfo:VX|K|bugs.htm H|mailto:fadden@fadden.com
|
||||
vti_cachedsvcrellinks:VX|FKUS|bugs.htm NHUS|mailto:fadden@fadden.com
|
||||
vti_cachedtitle:SR|Bugs & Features
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,22 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_timecreated:TR|22 Dec 1999 22:47:10 -0000
|
||||
vti_timelastmodified:TR|19 Feb 2007 23:13:28 -0000
|
||||
vti_filesize:IR|9646
|
||||
vti_title:SR|NuLib Home Page
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 HTTP-EQUIV=Content-Language en-us GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document description Home\\ page\\ for\\ NuLib,\\ NuLib2,\\ NufxLib,\\ ShrinkIt,\\ and\\ NuFX\\ (SHK)\\ archives keywords nulib,\\ nulib2,\\ nufxlib,\\ shk,\\ sdk,\\ bxy,\\ bse,\\ shrinkit,\\ nufx,\\ apple,\\ apple2,\\ emulator
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.8912
|
||||
vti_backlinkinfo:VX|
|
||||
vti_nexttolasttimemodified:TR|19 Sep 2005 05:42:45 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_cacheddtm:TX|19 Feb 2007 23:13:28 -0000
|
||||
vti_cachedlinkinfo:VX|H|downloads/index.htm H|nulib2-manual.htm H|nufxlibapi.htm H|bugs.htm H|library/index.htm H|nulib2-manual.htm H|nufxlibapi.htm H|http://www.faddensoft.com/ciderpress/ H|http://www.faddensoft.com/ H|http://www.fadden.com/ H|http://sourceforge.net S|http://sourceforge.net/sflogo.php
|
||||
vti_cachedsvcrellinks:VX|FHUS|downloads/index.htm FHUS|nulib2-manual.htm FHUS|nufxlibapi.htm FHUS|bugs.htm FHUS|library/index.htm FHUS|nulib2-manual.htm FHUS|nufxlibapi.htm NHHS|http://www.faddensoft.com/ciderpress/ NHHS|http://www.faddensoft.com/ NHHS|http://www.fadden.com/ NHHS|http://sourceforge.net NSHS|http://sourceforge.net/sflogo.php
|
||||
vti_cachedtitle:SR|NuLib Home Page
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|false
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|false
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_timecreated:TR|24 Dec 1999 08:11:12 -0000
|
||||
vti_timelastmodified:TR|19 Feb 2007 23:15:03 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_filesize:IR|110697
|
||||
vti_title:SR|NufxLib API
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Language en-us HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.8912
|
||||
vti_backlinkinfo:VX|nufxlibapi.htm index.htm
|
||||
vti_nexttolasttimemodified:TR|19 Feb 2007 22:35:33 -0000
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_cacheddtm:TX|19 Feb 2007 23:15:03 -0000
|
||||
vti_cachedlinkinfo:VX|K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm H|library/FTN.e08002.htm H|library/nufx-addendum.htm H|library/FTN.e08002.htm K|nufxlibapi.htm H|library/nufx-addendum.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm K|nufxlibapi.htm H|http://www.fadden.com/ H|http://www.nulib.com/
|
||||
vti_cachedsvcrellinks:VX|FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FHUS|library/FTN.e08002.htm FHUS|library/nufx-addendum.htm FHUS|library/FTN.e08002.htm FKUS|nufxlibapi.htm FHUS|library/nufx-addendum.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm FKUS|nufxlibapi.htm NHHS|http://www.fadden.com/ NHHS|http://www.nulib.com/
|
||||
vti_cachedtitle:SR|NufxLib API
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_timecreated:TR|16 Jan 2000 22:42:13 -0000
|
||||
vti_timelastmodified:TR|19 Feb 2006 02:02:53 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_filesize:IR|33618
|
||||
vti_title:SR|NuLib2 Manual
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.8912
|
||||
vti_backlinkinfo:VX|nulib2-manual.htm index.htm
|
||||
vti_nexttolasttimemodified:TR|19 Feb 2006 02:02:22 -0000
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_cacheddtm:TX|19 Feb 2006 02:02:53 -0000
|
||||
vti_cachedlinkinfo:VX|K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm K|nulib2-manual.htm H|http://www.nulib.com/ H|http://www.zlib.org/ K|nulib2-manual.htm H|library/nulib2-preserve.htm H|library/nulib2-preserve.htm K|nulib2-manual.htm H|http://www.fadden.com/ H|http://www.nulib.com/
|
||||
vti_cachedsvcrellinks:VX|FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm FKUS|nulib2-manual.htm NHHS|http://www.nulib.com/ NHHS|http://www.zlib.org/ FKUS|nulib2-manual.htm FHUS|library/nulib2-preserve.htm FHUS|library/nulib2-preserve.htm FKUS|nulib2-manual.htm NHHS|http://www.fadden.com/ NHHS|http://www.nulib.com/
|
||||
vti_cachedtitle:SR|NuLib2 Manual
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,18 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|31 Jan 2000 05:53:17 -0000
|
||||
vti_timelastmodified:TR|31 Jan 2000 05:53:17 -0000
|
||||
vti_filesize:IR|578
|
||||
vti_title:SR|Active To Do List
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=utf-8
|
||||
vti_extenderversion:SR|4.0.2.5526
|
||||
vti_backlinkinfo:VX|
|
||||
vti_cacheddtm:TX|31 Jan 2000 04:53:18 -0000
|
||||
vti_cachedlinkinfo:VX|
|
||||
vti_cachedsvcrellinks:VX|
|
||||
vti_cachedtitle:SR|Active To Do List
|
||||
vti_cachedbodystyle:SR|<body>
|
||||
vti_cachedhasbots:BR|false
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|false
|
|
@ -0,0 +1,18 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|31 Jan 2000 05:53:17 -0000
|
||||
vti_timelastmodified:TR|31 Jan 2000 05:53:17 -0000
|
||||
vti_cacheddtm:TX|31 Jan 2000 05:53:18 -0000
|
||||
vti_filesize:IR|580
|
||||
vti_cachedlinkinfo:VX|
|
||||
vti_cachedsvcrellinks:VX|
|
||||
vti_cachedtitle:SR|To Do List History
|
||||
vti_title:SR|To Do List History
|
||||
vti_cachedbodystyle:SR|<body>
|
||||
vti_cachedhasbots:BR|false
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|false
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=utf-8
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,23 @@
|
|||
<html><head>
|
||||
<META version="1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><TITLE>Active To Do List</TITLE>
|
||||
</head><body>
|
||||
<H1>Active To Do List</H1>
|
||||
<TABLE BORDER=1>
|
||||
<tr>
|
||||
<td><b>Number</b></td>
|
||||
<td><b>Task</b></td>
|
||||
<td><b>Pri</b></td>
|
||||
<td><b>Author</b></td>
|
||||
<td><b>Created By Tool</b></td>
|
||||
<td><b>Created On</b></td>
|
||||
<td><b>Modified On</b></td>
|
||||
<td><b>Completed</b></td>
|
||||
<td><b>Modified By</b></td>
|
||||
<td><b>Assigned To</b></td>
|
||||
<td><b>Link To</b></td>
|
||||
<td><b>Magic</b></td>
|
||||
<td><b>Description</b></td>
|
||||
</tr>
|
||||
</TABLE>
|
||||
</body></html>
|
|
@ -0,0 +1,23 @@
|
|||
<html><head>
|
||||
<META version="1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><TITLE>To Do List History</TITLE>
|
||||
</head><body>
|
||||
<H1>To Do List History</H1>
|
||||
<TABLE BORDER=1>
|
||||
<tr>
|
||||
<td><b>Number</b></td>
|
||||
<td><b>Task</b></td>
|
||||
<td><b>Pri</b></td>
|
||||
<td><b>Author</b></td>
|
||||
<td><b>Created By Tool</b></td>
|
||||
<td><b>Created On</b></td>
|
||||
<td><b>Modified On</b></td>
|
||||
<td><b>Completed</b></td>
|
||||
<td><b>Modified By</b></td>
|
||||
<td><b>Assigned To</b></td>
|
||||
<td><b>Link To</b></td>
|
||||
<td><b>Magic</b></td>
|
||||
<td><b>Description</b></td>
|
||||
</tr>
|
||||
</TABLE>
|
||||
</body></html>
|
|
@ -0,0 +1,2 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
C\:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\40\\bots\\vinavbar\\vinavbar.inf:VW|vinavbar
|
|
@ -0,0 +1,2 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vinavbar:VW|C:\\\\Program\\ Files\\\\Common\\ Files\\\\Microsoft\\ Shared\\\\Web\\ Server\\ Extensions\\\\40\\\\bots\\\\vinavbar\\\\vinavbar.inf vinavbar E I info N C:\\\\Program\\ Files\\\\Common\\ Files\\\\Microsoft\\ Shared\\\\Web\\ Server\\ Extensions\\\\40\\\\bots\\\\vinavbar\\\\fp4Avnb.dll
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,14 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
http\://www.zlib.org/:nulib2-manual.htm library/nufx-addendum.htm
|
||||
http\://sources.redhat.com/bzip2/:library/nufx-addendum.htm
|
||||
downloads/nulibdist.tar.gz:downloads/index.htm
|
||||
http\://www.faddensoft.com/:index.htm
|
||||
http\://www.fadden.com/:nulib2-manual.htm library/nulib2-preserve.htm nufxlibapi.htm index.htm library/nufx-addendum.htm
|
||||
http\://www.faddensoft.com/ciderpress/:downloads/index.htm index.htm
|
||||
mailto\:fadden@fadden.com:bugs.htm
|
||||
http\://www.nulib.com/:nulib2-manual.htm library/nulib2-preserve.htm nufxlibapi.htm library/nufx-addendum.htm
|
||||
http\://www.fadden.com/dl-apple2/:library/index.htm
|
||||
http\://sourceforge.net/projects/nulib2/:downloads/index.htm
|
||||
http\://sourceforge.net/sflogo.php:downloads/index.htm index.htm
|
||||
http\://sourceforge.net:index.htm
|
||||
downloads/nulib2_win32.zip:downloads/index.htm
|
|
@ -0,0 +1,28 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_casesensitiveurls:IX|0
|
||||
vti_textextensions:SX|.txt.
|
||||
vti_featurelist:VX|vti_ACAll vti_ServiceMarkUrlDirBrowse vti_ServiceMarkUrlDirExec vti_ServiceMarkUrlDirScript vti_ServerEmailTransport vti_ServerIndexServer vti_ServerASP
|
||||
vti_httpdversion:SX|FrontPage DBW
|
||||
vti_ignorekeyboard:IR|0
|
||||
vti_navbuttonuplabel:SR|Up
|
||||
vti_dependenciesood:IR|1
|
||||
vti_webservertype:SR|diskweb
|
||||
vti_categories:VR|Travel Expense\\ Report Business Competition Goals/Objectives Ideas Miscellaneous Waiting VIP In\\ Process Planning Schedule
|
||||
vti_navbuttonnextlabel:SR|Next
|
||||
vti_approvallevels:VR|Content\\ Review Legal\\ Review Code\\ Review Manager\\ Review
|
||||
vti_timecreated:TR|22 Dec 1999 22:47:08 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_navbuttonprevlabel:SR|Back
|
||||
vti_borderdefault:SR|t
|
||||
vti_longfilenames:IX|1
|
||||
vti_welcomenames:VX|index.htm index.html default.htm default.html welcome.htm welcome.html home.htm home.html
|
||||
vti_insecureserverurl:SR|file://
|
||||
vti_disableautoimgsizeexts:SX|.asp
|
||||
vti_oldestcompatibleversion:SR|2.0.0.0
|
||||
vti_restartmanual:IX|0
|
||||
vti_defaultcharset:SR|windows-1252
|
||||
vti_defaultlanguage:SR|en
|
||||
vti_publishmetainfokeys:VR|vti_assignedto vti_approvallevel vti_categories vti_description
|
||||
vti_autorecalc:IX|1
|
||||
vti_htmlextensions:SX|.htm.html.shtml.shtm.stm.htt.htx.asp.alx.asa.
|
||||
vti_navbuttonhomelabel:SR|Home
|
|
@ -0,0 +1 @@
|
|||
/
|
|
@ -0,0 +1,11 @@
|
|||
3.0.0.507
|
||||
1008
|
||||
1000,index.htm,0,NuLib Home Page,0,945985133,1
|
||||
vti_globalpage:BW|true
|
||||
1001,downloads/index.htm,0,NuLib Downloads,1000,947902101,0
|
||||
1003,library/index.htm,0,NuLib Library,1000,949192642,0
|
||||
1007,nulib2-manual.htm,0,NuLib2 Manual,1000,948062548,0
|
||||
1002,nufxlibapi.htm,0,NufxLib API,1000,946023114,0
|
||||
1004,bugs.htm,0,Bugs & Features,1000,950147319,0
|
||||
1005,library/nufx-addendum.htm,0,NuFX Addendum,1003,948051434,0
|
||||
1006,library/nulib2-preserve.htm,0,ProDOS Attribute Preservation,1003,948076779,0
|
|
@ -0,0 +1,80 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Language" content="en-us">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>Bugs & Features</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong>Bugs & Features</strong></font><br>
|
||||
<nobr>[ <a href="index.htm">Home</a> ]</nobr> <nobr>[ <a href="downloads/index.htm">NuLib Downloads</a> ]</nobr> <nobr>[ <a href="library/index.htm">NuLib Library</a> ]</nobr> <nobr>[ <a href="nulib2-manual.htm">NuLib2 Manual</a> ]</nobr> <nobr>[ <a href="nufxlibapi.htm">NufxLib API</a> ]</nobr> <nobr>[ Bugs & Features ]</nobr></p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
|
||||
<p align="left"> </p>
|
||||
<p align="left">Skip down to the bottom for the <a href="#todo"> list of suggested
|
||||
features</a>.</p>
|
||||
<p align="left">NuLib2 and NufxLib will always have the same version number for
|
||||
the time being, because they're being distributed together. It's less
|
||||
confusing that way.</p>
|
||||
<p align="left"> </p>
|
||||
<h2 align="left">Known Bugs - NufxLib v2.0</h2>
|
||||
<p align="left">None so far.</p>
|
||||
<p align="left"> </p>
|
||||
<h2 align="left">Known Bugs - NuLib2 v2.0</h2>
|
||||
<p align="left">None so far.</p>
|
||||
<p align="left"> </p>
|
||||
<h2 align="left">Reporting New Bugs</h2>
|
||||
<p align="left">Some good things to include in a bug report:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p align="left">What version of NuLib2 and NufxLib are you using?</li>
|
||||
<li>
|
||||
<p align="left">What compile options were used (NuLib2 shows this at the top
|
||||
of the usage screen; just type "nulib2")?</li>
|
||||
<li>
|
||||
<p align="left">What operating system are you running? What version?</li>
|
||||
<li>
|
||||
<p align="left">Did you build it yourself or get a binary from a web
|
||||
site? Did you make any changes? What compiler did you use?</li>
|
||||
<li>
|
||||
<p align="left">What exactly do you have to do to make the bug occur?
|
||||
(If it's a NuLib2 problem, list the command, and preferably where I can find
|
||||
a copy of the archive or the files involved. If it's a NufxLib
|
||||
problem, all of the above, plus a sequence of Exerciser commands that make
|
||||
the bug happen.)</li>
|
||||
</ul>
|
||||
<p align="left">It's difficult to fix a bug if it isn't repeatable or if it only
|
||||
occurs on an operating system I don't have access to. The more obscure
|
||||
your circumstances, the more details you will need to provide.</p>
|
||||
<p align="left">Please use the github issue tracker to file bugs.</p>
|
||||
<p align="left"> </p>
|
||||
<h2 align="left"><a name="todo">Product "To Do" List</a></h2>
|
||||
<p>For the NuLib2 application:</p>
|
||||
<ul>
|
||||
<li>Extract files to AppleDouble format. This would allow UNIX
|
||||
AppleShare servers like netatalk to serve up extracted files immediately,
|
||||
and preserve all file attributes.</li>
|
||||
<li>Support .2MG disk images automatically when adding and extracting.</li>
|
||||
<li>Add BinSCII support.</li>
|
||||
<li>Need some regression tests.</li>
|
||||
</ul>
|
||||
<p>For NufxLib:</p>
|
||||
<ul>
|
||||
<li>Add native resource fork support (for systems like Mac OS and GS/OS).</li>
|
||||
<li>Ought to store empty directories.</li>
|
||||
<li>Make name-comparison sensitivity (for get-by-name and duplicate checking)
|
||||
configurable.</li>
|
||||
<li>Need a complete set of regression tests.</li>
|
||||
</ul>
|
||||
<p align="left">
|
||||
|
||||
<!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|31 Jan 2000 05:35:38 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|downloads/index.htm
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_timecreated:TR|23 Dec 1999 21:39:46 -0000
|
||||
vti_timelastmodified:TR|19 Feb 2007 23:57:54 -0000
|
||||
vti_filesize:IR|4569
|
||||
vti_title:SR|NuLib Downloads
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Language en-us HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.8912
|
||||
vti_backlinkinfo:VX|index.htm
|
||||
vti_nexttolasttimemodified:TR|19 Feb 2007 23:53:31 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_cacheddtm:TX|19 Feb 2007 23:57:54 -0000
|
||||
vti_cachedlinkinfo:VX|H|http://www.faddensoft.com/ciderpress/ H|nulibdist.tar.gz H|http://sourceforge.net/projects/nulib2/ S|http://sourceforge.net/sflogo.php H|nulib2_win32.zip H|nulib325.tar.gz H|nulib_win32.zip H|nulib-tb.zip H|gsnulib.shk H|../library/index.htm
|
||||
vti_cachedsvcrellinks:VX|NHHS|http://www.faddensoft.com/ciderpress/ NHUS|downloads/nulibdist.tar.gz NHHS|http://sourceforge.net/projects/nulib2/ NSHS|http://sourceforge.net/sflogo.php NHUS|downloads/nulib2_win32.zip FHUS|downloads/nulib325.tar.gz FHUS|downloads/nulib_win32.zip FHUS|downloads/nulib-tb.zip FHUS|downloads/gsnulib.shk FHUS|library/index.htm
|
||||
vti_cachedtitle:SR|NuLib Downloads
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|10 Mar 2004 21:56:34 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|11 Oct 2004 22:43:46 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Sep 2005 05:34:35 -0000
|
||||
vti_extenderversion:SR|4.0.2.8912
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|16 Jan 2000 20:55:18 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|downloads/index.htm
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|23 May 2000 00:54:24 -0000
|
||||
vti_extenderversion:SR|4.0.2.5526
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|11 Oct 2002 23:01:26 -0000
|
||||
vti_extenderversion:SR|4.0.2.5526
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Mar 2003 02:47:06 -0000
|
||||
vti_extenderversion:SR|4.0.2.6513
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|16 Oct 2003 22:59:04 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|10 Mar 2004 21:43:56 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|11 Oct 2004 22:30:28 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Sep 2005 05:31:47 -0000
|
||||
vti_extenderversion:SR|4.0.2.8912
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Feb 2006 01:54:21 -0000
|
||||
vti_extenderversion:SR|4.0.2.8912
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|20 Feb 2007 00:45:59 -0000
|
||||
vti_extenderversion:SR|4.0.2.8912
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|07 Jun 1998 05:06:02 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|downloads/index.htm library/index.htm
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|16 Jan 2000 21:01:54 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|downloads/index.htm
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 May 2000 01:04:30 -0000
|
||||
vti_extenderversion:SR|4.0.2.5526
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|23 May 2000 00:46:16 -0000
|
||||
vti_extenderversion:SR|4.0.2.5526
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|11 Oct 2002 22:59:56 -0000
|
||||
vti_extenderversion:SR|4.0.2.5526
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Mar 2003 02:47:00 -0000
|
||||
vti_extenderversion:SR|4.0.2.6513
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|16 Oct 2003 22:59:04 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|10 Mar 2004 21:38:18 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|11 Oct 2004 22:25:22 -0000
|
||||
vti_extenderversion:SR|4.0.2.7802
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Sep 2005 05:31:43 -0000
|
||||
vti_extenderversion:SR|4.0.2.8912
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Feb 2006 01:54:39 -0000
|
||||
vti_extenderversion:SR|4.0.2.8912
|
|
@ -0,0 +1,3 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|19 Feb 2007 23:46:00 -0000
|
||||
vti_extenderversion:SR|4.0.2.8912
|
Binary file not shown.
|
@ -0,0 +1,84 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Language" content="en-us">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>NuLib Downloads</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong>NuLib Downloads</strong></font><br>
|
||||
<nobr>[ <a href="../index.htm">Home</a> ]</nobr> <nobr>[ NuLib Downloads ]</nobr> <nobr>[ <a href="../library/index.htm">NuLib Library</a> ]</nobr> <nobr>[ <a href="../nulib2-manual.htm">NuLib2 Manual</a> ]</nobr> <nobr>[ <a href="../nufxlibapi.htm">NufxLib API</a> ]</nobr> <nobr>[ <a href="../bugs.htm">Bugs & Features</a> ]</nobr></p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><b><font color="#008000">Hey!</font></b> If you're looking for a GUI "ShrinkIt for Windows", take a look at <a href="http://ciderpress.sourceforge.net/">CiderPress</a>, which uses NufxLib to access ShrinkIt archives.</p>
|
||||
<h2>NuLib2 and NufxLib</h2>
|
||||
<p>Source code and Win32 binaries are available for download from
|
||||
<a href="https://github.com/fadden/nulib2">github</a>. Click on
|
||||
the "releases" link.</p>
|
||||
<p>NuLib2 and NufxLib are packaged together. Instructions for
|
||||
building them are included with the sources. Version 2.2.2 has been built
|
||||
and tested on the following systems:</p>
|
||||
<ul>
|
||||
<li>[x86 MSVC++2013] Windows 7</li>
|
||||
<li>[x86] Ubuntu 14.04 (gcc 4.8.2)</li>
|
||||
</ul>
|
||||
Earlier versions have also been tested on:
|
||||
<ul>
|
||||
<li>[x86 MSVC++6.0] Windows XP SP2</li>
|
||||
<li>[x86] Fedora Core 4 (gcc 4.0)</li>
|
||||
<li>[x86] Darwin (Mac OS X)</li>
|
||||
<li>[x86 MSVC++6.0] Windows 2000 Professional SP4</li>
|
||||
<li>[x86 MSVC++6.0] Windows XP Professional SP1, SP2</li>
|
||||
<li>[x86 MSVC++6.0] Windows 98SE</li>
|
||||
<li>[x86 DJGPP] Windows 98SE</li>
|
||||
<li>[x86 MSVC++6.0] Windows NT 4 Server</li>
|
||||
<li>[x86] Linux (Debian 2.2)</li>
|
||||
<li>[x86] Linux (Red Hat 5.x, 6.0. 6.1, 7.3, 8.0, 9.0, FC3, FC4)</li>
|
||||
<li>[x86] Solaris 7, 8</li>
|
||||
<li>[x86] FreeBSD (4.7-RC and 4.8)</li>
|
||||
<li>[x86] OpenBSD 2.5 and 2.6</li>
|
||||
<li>[x86] BeOS 4.5.2</li>
|
||||
<li>[PPC - G4] Mac OS X 10.2 SERVER Edition</li>
|
||||
<li>[PPC - RS/6000] Linux 2.2 (Debian 3.0)</li>
|
||||
<li>[PPC - xlc] AIX 4.3</li>
|
||||
<li>[PPC - mwerks] BeOS 4.5.2</li>
|
||||
<li>[Alpha] Linux 2.2 (Debian 3.0)</li>
|
||||
<li>[AMD64] Linux 2.4 (SuSE 8 ES on Opteron)</li>
|
||||
<li>[Sparc - R220] Sun Solaris 8</li>
|
||||
<li>[Sparc] SunOS 4.1.4</li>
|
||||
<li>[Sparc - SunPro C] Solaris 2.6</li>
|
||||
<li>[Sparc] Solaris 7</li>
|
||||
<li>[CerfCube SA1110] Linux 2.4 (Debian 3.0)</li>
|
||||
</ul>
|
||||
<h2>NuLib "Classic"</h2>
|
||||
<p>The original NuLib has been ported to many different systems. Version
|
||||
3.2.5 is functionally similar to v3.2.4, but the source code and documentation
|
||||
were cleaned up by Devin Reade, making it easier to build. NuLib2 is
|
||||
generally superior, but NuLib does have the advantage of running under 16-bit MS-DOS
|
||||
and GS/OS.</p>
|
||||
<p>Documentation is included with the sources and binaries.</p>
|
||||
<p>Source code:</p>
|
||||
<ul>
|
||||
<li><a href="nulib325.tar.gz">NuLib v3.2.5 source code</a> (113K .tar.gz)</li>
|
||||
</ul>
|
||||
<p>Binaries:</p>
|
||||
<ul>
|
||||
<li><a href="nulib_win32.zip">Win32 (Visual C++) port of NuLib v3.2.4</a> (67K
|
||||
zip)</li>
|
||||
<li><a href="nulib-tb.zip">Tom Baker's 16-bit MS-DOS (Borland C) port of NuLib
|
||||
v3.0.3</a> (57K zip)</li>
|
||||
<li><a href="gsnulib.shk">IIgs shell port of NuLib v3.2.2</a> (84K shk)</li>
|
||||
</ul>
|
||||
Source code for older versions of the original NuLib are available in the <a href="../library/index.htm">library</a>.
|
||||
<p> <!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,167 @@
|
|||
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta http-equiv="Content-Language" content="en-us">
|
||||
<title>NuLib Home Page</title>
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<meta name="Microsoft Border" content>
|
||||
|
||||
<meta name="description"
|
||||
content="Home page for NuLib, NuLib2, NufxLib, ShrinkIt, and NuFX (SHK) archives">
|
||||
<meta name="keywords"
|
||||
content="nulib, nulib2, nufxlib, shk, sdk, bxy, bse, shrinkit, nufx, apple, apple2, emulator">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000">
|
||||
<h1 align="center">NuLib Home Page</h1>
|
||||
<p align="center"><u><b>Shortcuts</b></u><br>
|
||||
go to the <a href="downloads/index.htm">downloads</a> area<br>
|
||||
read the <a href="nulib2-manual.htm"> NuLib2 manual</a><br>
|
||||
see the <a href="nufxlibapi.htm">NufxLib library API</a> documentation<br>
|
||||
<a href="bugs.htm">report a bug</a> in NufxLib or NuLib2<br>
|
||||
check <a href="library/index.htm">the library</a> for old programs and misc docs</p>
|
||||
<p> </p>
|
||||
<p>This is the home page for NuLib, NuLib2, NufxLib, and various items related
|
||||
to ShrinkIt and NuFX archives.</p>
|
||||
<p> </p>
|
||||
<h2>What is NuLib?</h2>
|
||||
<p>NuLib is a disk and file archive program, similar in principle to PKZIP. Instead of ZIP
|
||||
archives, it manipulates NuFX archives, which are usually identified with
|
||||
".SHK", ".SDK", or ".BXY".</p>
|
||||
<p>The ".SHK" file extension is derived from ShrinkIt, the de facto
|
||||
archiving standard for Apple II computers. Both NuFX and ShrinkIt were developed by Andy Nicholas,
|
||||
and were initially released in January of 1989.</p>
|
||||
<p>In mid-1989, while a sophomore in college, I started playing around
|
||||
with the file format. My goal was to write a simple program that could
|
||||
list the contents of a NuFX file. I had recently finished my first class
|
||||
on C programming, and wanted a small project to play around with. I never
|
||||
intended to go any further with it than just being able to list files.</p>
|
||||
<p>Three name changes (NuView to NuARC to CShrink to NuLib) and more than three
|
||||
years later, NuLib was a full-featured archiver, and the code had finally settled down to where it could be left
|
||||
alone. Except for a major overhaul by Devin Reade in late 1996, NuLib
|
||||
hasn't changed much since.</p>
|
||||
<h2>What is NuLib2?</h2>
|
||||
<p>NuLib was functional, but had a number of flaws. It couldn't handle
|
||||
resource forks, it was clumsy to use with BXY (ShrinkIt wrapped in Binary II)
|
||||
archives, it used more memory than it needed to, and some features -- notably
|
||||
the archive integrity test -- were entirely broken. Due to generally poor
|
||||
architecture, it was difficult to fix problems and add features.</p>
|
||||
<p>NuLib2 is a replacement for NuLib. It does pretty much everything the
|
||||
original NuLib did, and adds a number of new features. NuLib2 is
|
||||
distributed as source code, under the terms of the BSD License.</p>
|
||||
<p>The <a href="nulib2-manual.htm">NuLib2 manual</a> has a quick comparison of
|
||||
the two programs.</p>
|
||||
|
||||
<p>One additional "feature" of NuLib2: it was built on top of NufxLib.</p>
|
||||
<h2>What is NufxLib?</h2>
|
||||
<p>NufxLib is a NuFX file archive manipulation library. Unlike most other
|
||||
compression library products, NufxLib goes beyond extracting and listing files.
|
||||
Full support for additions, deletions, and renaming of archived files is
|
||||
supported, with a transaction-oriented interface for maximum efficiency and
|
||||
reliability.</p>
|
||||
<p>A thorough description of the library's features and interface is available <a href="nufxlibapi.htm">here</a>.
|
||||
NufxLib is distributed as source code under the terms of the BSD License.</p>
|
||||
<p>Possible uses for NufxLib:</p>
|
||||
<ul>
|
||||
<li>Command-line applications like NuLib2.</li>
|
||||
<li>GUI applications like <a href="http://www.faddensoft.com/ciderpress/">CiderPress</a>,
|
||||
which can isolate ShrinkIt code in a DLL.</li>
|
||||
<li>Automatic handling of .SHK archives in Apple II emulators and 2IMG
|
||||
converters.</li>
|
||||
<li>Possible inclusion of NuFX support in mainstream applications like WinZip.</li>
|
||||
<li>Embedded applications, such as a filesystem driver that transparently
|
||||
unpacks NuFX archives (a la "zipfolders").</li>
|
||||
</ul>
|
||||
<h2>Why did I do this?</h2>
|
||||
<p>In late 1997, I cranked up my Apple IIgs for the first time in a long
|
||||
while. It failed to boot. The old 100MB hard drive had seized up
|
||||
from "stiction". A friend of mine and I managed to resurrect
|
||||
that drive and a second 80MB hard drive that had also seized up, but it was
|
||||
clear the drives' days were numbered.</p>
|
||||
<p>I replaced the old ones with a new 2GB drive, which was the smallest I could
|
||||
find in retail stores at the time. It occurred to me then that it would be
|
||||
useful, as well as prudent, to have a complete file archive of the contents of
|
||||
my hard drive. GS/ShrinkIt was capable of constructing such a thing, but
|
||||
couldn't extract from it because the archive was too large. YankIt and NuLib could do the extraction, but
|
||||
were too clumsy to be useful.</p>
|
||||
<p>I resolved to write a program that could handle these archives. I
|
||||
thought it would be best to write it as a Win32 GUI application. However,
|
||||
I also wanted a better version of NuLib for UNIX. The NuLib sources are a
|
||||
pile of dung, so adding the features I wanted would be most easily accomplished
|
||||
by rewriting the whole thing from scratch.</p>
|
||||
<p>Around the middle of 1998, I started fleshing out the API for something I
|
||||
called "NufxLib". The library would do all the hard work for
|
||||
both command line and GUI applications, and perhaps would be embedded into Apple
|
||||
II emulators as well, allowing seamless access to ShrinkIt-compressed disk
|
||||
images.</p>
|
||||
<p>For the next 1.5 years, I would occasionally pick up the project and then
|
||||
leave it alone for weeks at a time. This continued until I left a big
|
||||
company for a small startup, and knew that my free time was about to evaporate
|
||||
entirely. I decided to finish up what I could and make it available.
|
||||
Version 1.0 was released in May of 2000.</p>
|
||||
<p>In December of 2002, I decided it was time to learn how to write Windows
|
||||
software. Learning a new system is easier when you're working with
|
||||
something you know, so I decided to use NufxLib as the foundation of a Win32
|
||||
application. The result, CiderPress, is available from the <a href="http://www.faddensoft.com/">faddenSoft</a>
|
||||
web site.</p>
|
||||
<h2>Visible Changes in v1.1</h2>
|
||||
<p>New stuff in NufxLib v1.1:</p>
|
||||
<ul>
|
||||
<li>Support for SQueeze and LZC compression. NufxLib now fully supports
|
||||
all compression formats described in the NuFX specification.</li>
|
||||
<li>Support for zlib "deflate" compression and libbz2 BWT
|
||||
compression as extensions to the
|
||||
NuFX standard.</li>
|
||||
<li>Compression code may be disabled to reduce the size of the library.
|
||||
A new "feature test" interface allows applications to determine
|
||||
which methods are supported.</li>
|
||||
<li>The "launder" program has been updated to allow selection of the
|
||||
compression format to convert to. ("Launder" converts all
|
||||
files and disks in an archive from one compression format to another.)</li>
|
||||
</ul>
|
||||
<p>New stuff in NuLib2 v1.1:</p>
|
||||
<ul>
|
||||
<li>Support for listing, testing, and extracting files from Binary II archives.</li>
|
||||
<li>New "-z" flag to use "deflate" or "bzip2".</li>
|
||||
<li>Extended help output with "-h" command.</li>
|
||||
</ul>
|
||||
<h2>Visible Changes in v2.0</h2>
|
||||
<p>Version 2.0 is actually a rather small release. Some changes in NufxLib broke
|
||||
binary compatibility, so it was necessary to increment the major version.</p>
|
||||
<p>New stuff in NufxLib v2.0:</p>
|
||||
<ul>
|
||||
<li>Can be built as a Windows DLL.</li>
|
||||
<li>NufxLib no longer tries to free memory allocated by the application (a
|
||||
callback is used instead).</li>
|
||||
<li>A high-ASCII text stripper is now available (useful for DOS text files and
|
||||
Merlin 8 source code).</li>
|
||||
</ul>
|
||||
<p>New stuff in NuLib2 v2.0:</p>
|
||||
<ul>
|
||||
<li>Filename comparisons are now case-insensitive.</li>
|
||||
<li>Can be built with NufxLib in a DLL.</li>
|
||||
<li>Changed handling of reserved names like "AUX" so that the
|
||||
original names are better preserved. This creates filenames with
|
||||
"%00" in them, which could confuse older versions of NuLib2 (e.g.
|
||||
"nulib2 -ae %00aux" will not work well in v1.x).</li>
|
||||
<li>Files are now added with ':' as the pathname separator, regardless of
|
||||
OS. Win32 handling now recognizes both '/' and '\' as path separators.</li>
|
||||
<li>Disk images extracted with "-ee" now have ".PO" add to
|
||||
their filenames. This should make it easier to load them in an Apple
|
||||
II emulator.</li>
|
||||
</ul>
|
||||
<h2>Future Directions</h2>
|
||||
<p>The code appears to be stable, so I'm going to leave it alone for a while.
|
||||
If you're interested in developing applications with NufxLib, send a message to
|
||||
fadden -at- fadden.com.</p>
|
||||
<hr>
|
||||
<p>NuLib, NuLib2, and NufxLib were written by <a href="http://www.fadden.com/">Andy
|
||||
McFadden</a>. Please see the documentation for each product to
|
||||
see a list of contributors.</p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* Compute 16-bit CRCs.
|
||||
*
|
||||
* Adapted from code in NuLib, http://www.nulib.com/.
|
||||
*/
|
||||
#include <assert.h>
|
||||
|
||||
/* define this if you want a table-based lookup */
|
||||
#define CRC_TAB
|
||||
|
||||
#ifdef CRC_TAB
|
||||
/*
|
||||
* updcrc macro derived from article Copyright (C) 1986 Stephen Satchell.
|
||||
* NOTE: First srgument must be in range 0 to 255.
|
||||
* Second argument is referenced twice.
|
||||
*
|
||||
* Programmers may incorporate any or all code into their programs,
|
||||
* giving proper credit within the source. Publication of the
|
||||
* source routines is permitted so long as proper credit is given
|
||||
* to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
|
||||
* Omen Technology.
|
||||
*/
|
||||
|
||||
/*#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp)*/
|
||||
#define updcrc(cp, crc) ( (crctab[((crc >> 8) & 0xFF) ^ cp] ^ (crc << 8)) & 0xFFFF)
|
||||
|
||||
/* crctab calculated by Mark G. Mendel, Network Systems Corporation */
|
||||
const unsigned short crctab[256] = {
|
||||
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
|
||||
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
|
||||
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
|
||||
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
|
||||
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
|
||||
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
|
||||
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
|
||||
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
|
||||
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
|
||||
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
|
||||
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
|
||||
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
|
||||
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
|
||||
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
|
||||
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
|
||||
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
|
||||
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
|
||||
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
|
||||
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
|
||||
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
|
||||
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
||||
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
|
||||
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
|
||||
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
|
||||
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
|
||||
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
|
||||
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
|
||||
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
|
||||
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
|
||||
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
|
||||
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Calculate CRC on a region. Pass in seed (which can be an initial
|
||||
* value -- typically zero -- or the result of an earlier computation),
|
||||
* and the pointer and length of the buffer to compute on.
|
||||
*
|
||||
* A CRC is the result of a mathematical operation based on the
|
||||
* coefficients of a polynomial when multiplied by X^16 then divided by
|
||||
* the generator polynomial (X^16 + X^12 + X^5 + 1) using modulo two
|
||||
* arithmetic.
|
||||
*
|
||||
* This routine is a slightly modified verison of one found in:
|
||||
* _Advanced Programming Techniques for the Apple //gs Toolbox_
|
||||
* By Morgan Davis and Dan Gookin (Compute! Publications, Inc.)
|
||||
*
|
||||
* This can either calculate the CRC bit-by-bit or use a table.
|
||||
* Depending on CPU architecture, one may be dramatically faster than
|
||||
* the other.
|
||||
*/
|
||||
unsigned short
|
||||
CalcCRC16(unsigned short seed, const unsigned char* ptr, int count)
|
||||
{
|
||||
unsigned short CRC = seed;
|
||||
#ifndef CRC_TAB
|
||||
int x;
|
||||
assert(sizeof(unsigned short) == 2); /* I think this is assumed */
|
||||
#endif
|
||||
|
||||
do {
|
||||
#ifndef CRC_TAB
|
||||
CRC ^= *ptr++ << 8; /* XOR hi-byte of CRC w/dat */
|
||||
for (x = 8; x; --x) /* Then, for 8 bit shifts... */
|
||||
if (CRC & 0x8000) /* Test hi order bit of CRC */
|
||||
CRC = CRC << 1 ^ 0x1021; /* if set, shift & XOR w/$1021 */
|
||||
else
|
||||
CRC <<= 1; /* Else, just shift left once. */
|
||||
#else
|
||||
CRC = updcrc(*ptr++, CRC); /* look up new value in table */
|
||||
#endif
|
||||
} while (--count);
|
||||
|
||||
return (CRC);
|
||||
}
|
||||
|
|
@ -0,0 +1,344 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>FTN.e00001</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong></strong></font><br>
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
<h2>Apple II FTN - AppleSingle File</h2>
|
||||
<p><a href="index.htm">Back to nulib.com library</a></p>
|
||||
<hr><pre>
|
||||
Apple II
|
||||
File Type Notes
|
||||
_____________________________________________________________________________
|
||||
Developer Technical Support
|
||||
|
||||
File Type: $E0 (224)
|
||||
Auxiliary Type: $0001
|
||||
|
||||
Full Name: AppleSingle File
|
||||
Short Name: AppleSingle File
|
||||
|
||||
Revised by: Matt Deatherage January 1991
|
||||
Written by: Matt Deatherage March 1989
|
||||
|
||||
Files of this type and auxiliary type contain a file in AppleSingle format.
|
||||
Changes since March 1990: Added information about AppleSingle version 2.0.
|
||||
_____________________________________________________________________________
|
||||
|
||||
AppleSingle is one of two standards (the other is AppleDouble) put forth by
|
||||
Apple Computer, Inc. for representing files on foreign file systems while
|
||||
preserving all attributes of the file's home system on file systems that do
|
||||
not support the same attributes.
|
||||
|
||||
Experience indicated that a single format would be inadequate to cover all
|
||||
cases. Two closely related formats, however, can serve most needs. Although
|
||||
the primary impetus for developing these formats is storing extended files
|
||||
(files with both resource and data forks) on file systems that do not support
|
||||
the notion of two forks, the proposed formats are general enough that theycan be
|
||||
used to represent a file from any file system on any other file system.
|
||||
|
||||
AppleSingle keeps all attributes and the contents of both forks in a single file
|
||||
in the foreign file system, and this Note describes this file format.
|
||||
AppleDouble keeps the data fork as a separate file from the file attributes and
|
||||
the resource fork, and is described in the File Type Notes for File Type $E0,
|
||||
Auxiliary Types $0002 and $0003.
|
||||
|
||||
AppleSingle is intended to be used primarily as a storage format, especially for
|
||||
cases where you must store an extended file on a foreign file system and later
|
||||
reconstruct the extended file. AppleDouble is more appropriate for applications
|
||||
where the users of the foreign file system might want to modify the contents of
|
||||
the file. Since most applications keep file data in the data fork, AppleDouble
|
||||
format saves the contents of the data fork in one file.All other file
|
||||
attributes, including the resource fork, are kept in a separate file.
|
||||
|
||||
|
||||
Reasons for Using AppleSingle
|
||||
|
||||
There are several reasons for supporting an interchange format between file
|
||||
systems. Perhaps the most germane is one of the least obvious: handling
|
||||
extended files on foreign file systems which do not support extended files.
|
||||
|
||||
For example, the ProDOS FST in GS/OS can create an extended file on a ProDOS
|
||||
disk. However, ProDOS 8 is unable to operate on the file, since it sees itas
|
||||
having an unsupported storage type. If a telecommunications program or other
|
||||
utility capable of transferring files is operating under ProDOS 8 andattempts to
|
||||
receive an extended file, it is unable to create the file.
|
||||
|
||||
At this point, the application could use READ_BLOCK and WRITE_BLOCK commands,
|
||||
along with a knowledge of the ProDOS file system, to create the file on its own.
|
||||
However, this is strongly discouraged. The ProDOS file system format for
|
||||
extended files is not documented and could change in the future. In addition,
|
||||
the program could be running on a eight-bit system. If the disk is only used on
|
||||
an eight-bit system, the extended files would not only be unwanted, but also
|
||||
unremovable without using the disk on an Apple IIGS or later system running
|
||||
GS/OS.
|
||||
|
||||
However, if the application is aware of the AppleSingle format, it canquickly
|
||||
store an extended file in AppleSingle, leaving the conversion back to the
|
||||
extended file to GS/OS, or another operating system. This is the recommended
|
||||
way for ProDOS 8 applications to create and handle extended files. Useeither
|
||||
AppleSingle or AppleDouble.
|
||||
|
||||
|
||||
AppleSingle Format
|
||||
|
||||
An AppleSingle file contains a header followed by data. The header consists of
|
||||
several fixed fields and a list of entry descriptors, each pointing to an entry.
|
||||
Apple defines the following standard entries: Data Fork, Resource Fork, Real
|
||||
Name (name in the home file system), Comment, Icon and File Info. Each entry is
|
||||
optional, so it may not appear in the file.
|
||||
|
||||
Note: All numeric entries, including entries representing ProDOS data
|
||||
structures (such as file type and auxiliary type) are Reverse
|
||||
ordered. This is provided so any host CPU can attempt to
|
||||
interpret entries in the header without having to know the
|
||||
standard byte-ordering of the home file system. Therefore, in
|
||||
this Note you see descriptive entries like "Rev. 4 Bytes." This
|
||||
serves as a reminder that all header fields are stored high byte
|
||||
first, even though the notation Bytes does not imply any specific
|
||||
ordering in other File Type Notes.
|
||||
|
||||
Also note that ASCII strings are not stored in reverse order, just non-ASCII
|
||||
constants.
|
||||
|
||||
The Header:
|
||||
|
||||
Magic Number Rev. Long The Magic Number field is modeled after
|
||||
the feature in UNIX. It is intended to be
|
||||
used in whatever way the foreign file
|
||||
system distinguishes a file as AppleSingle
|
||||
format. See the section "Identifying
|
||||
AppleSingle Files." The Magic Number for
|
||||
AppleSingle format is $00051600, which is
|
||||
stored reverse as $00 $05 $16 $00 (reverse
|
||||
of normal 65816/6502 order).
|
||||
Version Number Rev. Long The version of AppleSingle format, in case
|
||||
the format evolves (more fields may be
|
||||
added to the header). The version
|
||||
described here is $00010000, stored
|
||||
(reverse) as $00 $01 $00 $00.
|
||||
Home File System 16 Bytes A fixed-length, 16-byte ASCII string not
|
||||
preceded by a length byte, but possibly
|
||||
padded with blanks. Apple has defined
|
||||
these values:
|
||||
ProDOS $50726F444F5320202020202020202020
|
||||
Macintosh $4D6163696E746F736820202020202020
|
||||
MS-DOS $4D532D444F5320202020202020202020
|
||||
Unix $556E9878202020202020202020202020
|
||||
VAX VMS $56415820564D53202020202020202020
|
||||
Apple welcomes suggestions for other file
|
||||
systems that should be included in this
|
||||
list.
|
||||
Number of entries Rev. Word Tells how many different entries are
|
||||
included in the file. This unsigned
|
||||
reverse word may be zero. If it is non-
|
||||
zero, then that number of entry
|
||||
descriptors immediately follows this
|
||||
field.
|
||||
|
||||
|
||||
For Each Entry:
|
||||
|
||||
Entry ID Rev. Long Identifies the entry. Apple has defined
|
||||
the following Entry IDs and their values:
|
||||
1 = Data Fork
|
||||
2 = Resource Fork
|
||||
3 = Real Name (The file's name in the home
|
||||
file system)
|
||||
4 = Comment* (standard Macintosh comment)
|
||||
5 = Icon, B&W* (standard Macintosh black
|
||||
and white icon)
|
||||
6 = Icon, Color* (reserved for Macintosh
|
||||
color icon)
|
||||
7 = File Info (file attributes,dates, etc.)
|
||||
9 = Finder Info* (standard Macintosh
|
||||
Finder Info)
|
||||
Entry IDs marked with asterisks (*) are
|
||||
not used for most files created under
|
||||
ProDOS or GS/OS. Furthermore, icon
|
||||
entries probably do not appear in most
|
||||
files since they are typically stored as a
|
||||
bundle in the application file's resource
|
||||
fork on the Macintosh. Apple reserves the
|
||||
range of Entry IDs from $0 to $7FFFFFFF
|
||||
for future use. The rest of the range is
|
||||
available for other systems to define
|
||||
their own entries. Apple does not
|
||||
arbitrate the use of the rest of the
|
||||
range.
|
||||
Descriptions of the standard entries are
|
||||
given below.
|
||||
Offset Rev. Long An unsigned reverse long which indicates
|
||||
the byte offset from the start of the file
|
||||
to the start of the entry.
|
||||
Entry Length Rev. Long An unsigned reverse long which indicates
|
||||
the length of the entry in bytes. The
|
||||
length may be zero.
|
||||
|
||||
|
||||
Standard Entries:
|
||||
|
||||
The Real Name Entry:
|
||||
|
||||
The Real Name entry indicates the file's original filename in the host file
|
||||
system. This is not a Pascal or C string; it is just ASCII data. The length is
|
||||
indicated by the Entry Length field for the Real Name entry.
|
||||
|
||||
The File Info Entry:
|
||||
|
||||
The File Info entry (Entry ID = 7) is different for each home file system. For
|
||||
ProDOS files, the entry is 16 bytes long and consists of the creationdate and
|
||||
time and the modification date and time in ProDOS 8 (ProDOS 16/class zero GS/OS)
|
||||
form, the access word, a two-byte file type and four-byte auxiliary type. This
|
||||
is detailed in standard format below, along with defined FileInfo entries for
|
||||
some other file systems.
|
||||
|
||||
ProDOS:
|
||||
|
||||
Create Date Rev. 2 Bytes Creation date packed into standard
|
||||
ProDOS 8 format.
|
||||
Create Time Rev. 2 Bytes Creation time packed into standard
|
||||
ProDOS 8 format.
|
||||
Modification Date Rev. 2 Bytes Modification date packed into
|
||||
standard ProDOS 8 format.
|
||||
Modification Time Rev. 2 Bytes Modification time packed into
|
||||
standard ProDOS 8 format.
|
||||
Access Rev. Word The file's access. This may be used
|
||||
directly in ProDOS 16 or GS/OS calls; only
|
||||
the low byte is significant to ProDOS 8.
|
||||
File Type Rev. Word The file type of the original file. Only
|
||||
the low byte is significant to ProDOS 8.
|
||||
Auxiliary Type Rev. Long The auxiliary type of the original file.
|
||||
Only the low word is significant to ProDOS
|
||||
8.
|
||||
|
||||
Note: Although the ProDOS Access field, File Type and Auxiliary Type are
|
||||
the same length as found in ProDOS 16 and GS/OS structures, the
|
||||
Create and Modification Dates and Times are stored in two-byte
|
||||
(albeit byte-reversed) ProDOS 8 format, not eight-byte Apple IIGS
|
||||
format.
|
||||
|
||||
Macintosh:
|
||||
|
||||
Create Date Rev. Long Unsigned number of seconds between
|
||||
January 1, 1904, and the creation time of
|
||||
this file.
|
||||
Modification Date Rev. Long Unsigned number of seconds between
|
||||
January 1, 1904, and the last modification
|
||||
of this file.
|
||||
Last Backup Date Rev. Long Unsigned number of seconds between
|
||||
January 1, 1904, and the last backup time
|
||||
of this file.
|
||||
Attributes Rev. Long 32 boolean flags. Once the bytes are
|
||||
unreversed, bit zero is the locked bit and
|
||||
bit one is the protected bit.
|
||||
|
||||
MS-DOS:
|
||||
|
||||
Modification Date Rev. 4 Bytes MS-DOS format modification date.
|
||||
Attributes Rev. 2 Bytes MS-DOS attributes.
|
||||
|
||||
Unix:
|
||||
|
||||
Create Date/Time Rev. 4 Bytes Unix creation date and time.
|
||||
Last Use Date/Time Rev. 4 Bytes Unix time for the last
|
||||
time this file was used.
|
||||
Last Mod. Date/Time Rev. 4 Bytes Unix time for the last
|
||||
time this file was modified.
|
||||
|
||||
|
||||
The Finder Info Entry:
|
||||
|
||||
The Finder Info entry (Entry ID = 9) is for files where the host file system is
|
||||
Macintosh. It consists of 16 bytes of Finder Info followed by 16 bytes of
|
||||
Extended Finder Info. These are the fields ioFlFndrInfo followed by
|
||||
ioFlXFndrInfo, as described in Inside Macintosh, Volume IV-183. Newlycreated
|
||||
files have zeroes in all Finder Info subfields. If you are creating an
|
||||
AppleSingle file whose home system is Macintosh, you may zero all unknown
|
||||
fields, but you may want to set the fdType and fdCreator subfields.
|
||||
|
||||
|
||||
The Entries:
|
||||
|
||||
The entries themselves follow the header field and the entry descriptors.The
|
||||
actual data representing each entry must be in a single, contiguous block. The
|
||||
offset field in that entry's descriptor points to it. The entries could appear
|
||||
in any order, but since the data fork is the entry that is most commonly
|
||||
extended, Apple strongly recommends that the data fork always bekept last in the
|
||||
file to facilitate its extension. Apple also recommends that those entries that
|
||||
are most often read, such as Real Name, File Info (and Finder Info if present)
|
||||
be kept as close as possible to the header tomaximize the probability that a
|
||||
read of the first few blocks of the file retrieves these entries.
|
||||
|
||||
It is possible to have holes in the file (unused space between entries). To
|
||||
find the holes, you must take the list of entry descriptors and sort theminto
|
||||
increasing offset order. If the offset field of an entry is greater than the
|
||||
offset plus the length of the previous entry (sorted), then a hole exists
|
||||
between the entries. You can make use of such holes; for example, if afile's
|
||||
comment is ten bytes long, you could create a hole of 190 bytes after the
|
||||
comment field to easily allow for the comment to later expand to its maximum
|
||||
length of 200 bytes. Because an AppleSingle file may contain holes, you must
|
||||
find each entry by getting its offset from its entry descriptor, not by assuming
|
||||
that it begins after the previous entry.
|
||||
|
||||
Byte ordering in file header fields follows 68000 convention, and each header
|
||||
field has been so noted by the Reverse operator.
|
||||
|
||||
|
||||
Identifying AppleSingle files
|
||||
|
||||
As this is an interchange format, from a ProDOS directory entry there is no way
|
||||
to guarantee which files are AppleSingle files. Apple has allocated File Type
|
||||
$E0, Auxiliary Type $0001 for files which are AppleSingle files. We strongly
|
||||
encourage ProDOS 8 and GS/OS applications to use this file type and auxiliary
|
||||
type assignment when creating AppleSingle files.
|
||||
|
||||
AppleSingle files which do not have file type $E0 and auxiliary type $0001can
|
||||
most easily be identified by opening them and attempting to interpret them. If
|
||||
they are not AppleSingle files, the Magic Number is not contained in the first
|
||||
four bytes of the file. The chances that the file would begin with those four
|
||||
bytes and not be an AppleSingle file, on a purely random basis,are 4,294,967,295
|
||||
to 1. The chances that both the Magic Number and the Version bytes would be the
|
||||
same in a non-AppleSingle file are roughly 1.8 x 10^19 to 1.
|
||||
|
||||
|
||||
About AppleSingle 2.0
|
||||
|
||||
AppleSingle 2.0 is a revision to the original AppleSingle specification
|
||||
described in this Note. AppleSingle 2.0 comes closer to the ideal of an
|
||||
interchange format by allowing file information for multiple file systems in the
|
||||
same AppleSingle file.
|
||||
|
||||
AppleSingle 2.0 basically replaces the File Info entry (ID = 7) with a File
|
||||
Dates entry (ID = 8) and one or more host file system entries, such as a
|
||||
Macintosh File Info entry (ID = 10), a ProDOS File Info entry (ID = 11), or an
|
||||
MS-DOS File Info entry (ID = 12). Information on these entries and AppleSingle
|
||||
2.0 can be found in the AppleSingle/AppleDouble Formats for Foreign Files
|
||||
Developer's Note, available from APDA, AppleLink, and the Developer CD series.
|
||||
|
||||
|
||||
Further Reference
|
||||
_____________________________________________________________________________
|
||||
o Inside Macintosh, Volume IV
|
||||
o ProDOS 8 Technical Reference Manual
|
||||
o GS/OS Reference
|
||||
o AppleSingle/AppleDouble Formats for Foreign Files Developer's Note
|
||||
|
||||
</pre><hr>
|
||||
|
||||
<address>This document is Copyright by Apple Computer, Inc.</address>
|
||||
|
||||
<!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,462 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>FTN.e000023</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong></strong></font><br>
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
<h2>Apple II FTN - AppleDouble File</h2>
|
||||
<p><a href="index.htm">Back to nulib.com library</a></p>
|
||||
<hr><pre>
|
||||
Apple II
|
||||
File Type Notes
|
||||
_____________________________________________________________________________
|
||||
Developer Technical Support
|
||||
|
||||
File Type: $E0 (224)
|
||||
Auxiliary Types: $0002 & $0003
|
||||
|
||||
Full Name: AppleDouble Header File (Auxiliary Type $0002)
|
||||
AppleDouble Data File (Auxiliary Type $0003)
|
||||
Short Name: AppleDouble Header (Auxiliary Type $0002)
|
||||
AppleDouble Data (Auxiliary Type $0003)
|
||||
|
||||
Revised by: Matt Deatherage November 1990
|
||||
Written by: Matt Deatherage March 1989
|
||||
|
||||
Files of these types and auxiliary types contain file data in AppleDouble
|
||||
format.
|
||||
Changes since March 1990: Added information about AppleDouble 2.0.
|
||||
_____________________________________________________________________________
|
||||
|
||||
AppleDouble is one of two standards (the other is AppleSingle) put forth by
|
||||
Apple Computer, Inc. for representing files on foreign file systems while
|
||||
preserving all attributes of the file's home system on file systems that do not
|
||||
support the same attributes.
|
||||
|
||||
Experience indicated that a single format would be inadequate to cover all
|
||||
cases. Two closely related formats, however, can serve most needs. Although
|
||||
the primary impetus for developing these formats is storing extended files
|
||||
(files with both resource and data forks) on file systems that do not support
|
||||
the notion of two forks, the proposed formats are general enough that theycan be
|
||||
used to represent a file from any file system on any other file system.
|
||||
|
||||
AppleDouble keeps the data fork as a separate file from the file attributes and
|
||||
the resource fork, and this Note describes this file format. AppleSingle keeps
|
||||
all attributes and the contents of both forks in a single file in the foreign
|
||||
file system, and is described in the File Type Note for File Type$E0, Auxiliary
|
||||
Type $0001.
|
||||
|
||||
AppleSingle is intended to be used primarily as a storage format, especially for
|
||||
cases where you must store an extended file on a foreign file system and later
|
||||
reconstruct the extended file. AppleDouble is more appropriate for applications
|
||||
where the users of the foreign file system might want to modify the contents of
|
||||
the file. Since most applications keep file data in the data fork, AppleDouble
|
||||
format saves the contents of the data fork in one file.All other file
|
||||
attributes, including the resource fork, are kept in a separate file.
|
||||
|
||||
|
||||
Reasons for Using AppleDouble
|
||||
|
||||
There are several reasons for supporting an interchange format between file
|
||||
systems. Perhaps the most germane is one of the least obvious: handling
|
||||
extended files on foreign file systems which do not support extended files.
|
||||
|
||||
For example, the ProDOS FST in GS/OS can create an extended file on a ProDOS
|
||||
disk. However, ProDOS 8 is unable to operate on the file, since it sees itas
|
||||
having an unsupported storage type. If a telecommunications program or other
|
||||
utility capable of transferring files is operating under ProDOS 8 andattempts to
|
||||
receive an extended file, it is unable to create the file.
|
||||
|
||||
At this point, the application could use READ_BLOCK and WRITE_BLOCK commands,
|
||||
along with a knowledge of the ProDOS file system, to create the file on its own.
|
||||
However, this is strongly discouraged. The ProDOS file system format for
|
||||
extended files is not documented and could change in the future. In addition,
|
||||
the program could be running on a eight-bit system. If the disk is only used on
|
||||
an eight-bit system, the extended files would not only be unwanted, but also
|
||||
unremovable without using the disk on an Apple IIGS or later system running
|
||||
GS/OS.
|
||||
|
||||
However, if the application is aware of the AppleDouble format, it canquickly
|
||||
store an extended file in AppleDouble, leaving the conversion back to the
|
||||
extended file to GS/OS, or another operating system. This is the recommended
|
||||
way for ProDOS 8 applications to create and handle extended files. Useeither
|
||||
AppleSingle or AppleDouble.
|
||||
|
||||
|
||||
AppleDouble Format
|
||||
|
||||
AppleDouble consists of two files, an AppleDouble Header File and an AppleDouble
|
||||
Data File. The AppleDouble Header file contains a headerfollowed by data. The
|
||||
header consists of several fixed fields and a list of entry descriptors, each
|
||||
pointing to an entry. Apple defines these standardentries: Resource Fork, Real
|
||||
Name (name in the home file system), Comment, Icon and File Info. Each entry is
|
||||
optional, so it may not appear in the file. Wealso define the new entry Data
|
||||
Pathname, pointing to the pathname of the AppleDouble Data File. The Header
|
||||
File has exactly the same format as an AppleSingle file, except it has no data
|
||||
fork entry. The AppleDouble DataFile consists of just the data fork of the
|
||||
file, with no extra header at all.
|
||||
|
||||
Note: All numeric entries, including entries representing ProDOS data
|
||||
structures (such as file type and auxiliary type) are Reverse
|
||||
ordered. This is provided so any host CPU can attempt to
|
||||
interpret entries in the header without having to know the
|
||||
standard byte-ordering of the home file system. Therefore, in
|
||||
this Note you see descriptive entries like "Rev. 4 Bytes." This
|
||||
serves as a reminder that all header fields are stored high byte
|
||||
first, even though the notation Bytes does not imply any specific
|
||||
ordering in other File Type Notes.
|
||||
|
||||
Also note that ASCII strings are not stored in reverse order, just non-ASCII
|
||||
constants.
|
||||
|
||||
The Header in the Header File:
|
||||
|
||||
Magic Number Rev. Long The Magic Number field is modeled after
|
||||
the feature in UNIX. It is intended to be
|
||||
used in whatever way the foreign file
|
||||
system distinguishes a file as AppleDouble
|
||||
format. See the section "Identifying
|
||||
AppleDouble Files." The Magic Number for
|
||||
AppleDouble format is $00051607, which is
|
||||
stored reverse as $00 $05 $16 $07 (reverse
|
||||
of normal 65816/6502 order).
|
||||
Version Number Rev. Long The version of AppleDouble format, in case
|
||||
the format evolves (more fields may be
|
||||
added to the header). The version
|
||||
described here is $00010000, stored
|
||||
(reverse) as $00 $01 $00 $00.
|
||||
|
||||
Home File System 16 Bytes A fixed-length, 16-byte ASCII string not
|
||||
preceded by a length byte, but possibly
|
||||
padded with blanks. Apple has defined
|
||||
these values:
|
||||
ProDOS $50726F444F5320202020202020202020
|
||||
Macintosh $4D6163696E746F736820202020202020
|
||||
MS-DOS $4D532D444F5320202020202020202020
|
||||
Unix $556E9878202020202020202020202020
|
||||
VAX VMS $56415820564D53202020202020202020
|
||||
Apple welcomes suggestions for other file
|
||||
systems that should be included in this
|
||||
list.
|
||||
Number of entries Rev. Word Tells how many different entries are
|
||||
included in the file. This unsigned
|
||||
reverse word may be zero. If it is non-
|
||||
zero, then that number of entry
|
||||
descriptors immediately follows this
|
||||
field.
|
||||
|
||||
|
||||
For Each Entry:
|
||||
|
||||
Entry ID Rev. Long Identifies the entry. Apple has defined
|
||||
the following Entry IDs and their values:
|
||||
1 = Data Fork
|
||||
2 = Resource Fork
|
||||
3 = Real Name (The file's name in the home
|
||||
file system)
|
||||
4 = Comment* (standard Macintosh comment)
|
||||
5 = Icon, B&W* (standard Macintosh black
|
||||
and white icon)
|
||||
6 = Icon, Color* (reserved for Macintosh
|
||||
color icon)
|
||||
7 = File Info (file attributes,dates, etc.)
|
||||
9 = Finder Info* (standard Macintosh
|
||||
Finder Info)
|
||||
Entry IDs marked with asterisks (*) are
|
||||
not used for most files created under
|
||||
ProDOS or GS/OS. Furthermore, icon
|
||||
entries probably do not appear in most
|
||||
files since they are typically stored as a
|
||||
bundle in the application file's resource
|
||||
fork on the Macintosh. Apple reserves the
|
||||
range of Entry IDs from $0 to $7FFFFFFF
|
||||
for future use. The rest of the range is
|
||||
available for other systems to define
|
||||
their own entries. Apple does not
|
||||
arbitrate the use of the rest of the
|
||||
range.
|
||||
Descriptions of the standard entries are
|
||||
given below.
|
||||
Offset Rev. Long An unsigned reverse long which indicates
|
||||
the byte offset from the start of the file
|
||||
to the start of the entry.
|
||||
Entry Length Rev. Long An unsigned reverse long which indicates
|
||||
the length of the entry in bytes. The
|
||||
length may be zero.
|
||||
|
||||
|
||||
Standard Entries:
|
||||
|
||||
The Real Name Entry:
|
||||
|
||||
The Real Name entry indicates the file's original filename in the host file
|
||||
system. This is not a Pascal or C string; it is just ASCII data. The length is
|
||||
indicated by the Entry Length field for the Real Name entry.
|
||||
|
||||
The File Info Entry:
|
||||
|
||||
The File Info entry (Entry ID = 7) is different for each home file system. For
|
||||
ProDOS files, the entry is 16 bytes long and consists of the creationdate and
|
||||
time and the modification date and time in ProDOS 8 (ProDOS 16/class zero GS/OS)
|
||||
form, the access word, a two-byte file type and four-byte auxiliary type. This
|
||||
is detailed in standard format below, along with defined FileInfo entries for
|
||||
some other file systems.
|
||||
|
||||
ProDOS:
|
||||
|
||||
Create Date Rev. 2 Bytes Creation date packed into standard
|
||||
ProDOS 8 format.
|
||||
Create Time Rev. 2 Bytes Creation time packed into standard
|
||||
ProDOS 8 format.
|
||||
Modification Date Rev. 2 Bytes Modification date packed into
|
||||
standard ProDOS 8 format.
|
||||
Modification Time Rev. 2 Bytes Modification time packed into
|
||||
standard ProDOS 8 format.
|
||||
Access Rev. Word The file's access. This may be used
|
||||
directly in ProDOS 16 or GS/OS calls; only
|
||||
the low byte is significant to ProDOS 8.
|
||||
File Type Rev. Word The file type of the original file. Only
|
||||
the low byte is significant to ProDOS 8.
|
||||
Auxiliary Type Rev. Long The auxiliary type of the original file.
|
||||
Only the low word is significant to ProDOS
|
||||
8.
|
||||
|
||||
Note: Although the ProDOS Access field, File Type and Auxiliary Type are
|
||||
the same length as found in ProDOS 16 and GS/OS structures, the
|
||||
Create and Modification Dates and Times are stored in two-byte
|
||||
(albeit byte-reversed) ProDOS 8 format, not eight-byte Apple IIGS
|
||||
format.
|
||||
|
||||
Macintosh:
|
||||
|
||||
Create Date Rev. Long Unsigned number of seconds between
|
||||
January 1, 1904, and the creation time of
|
||||
this file.
|
||||
Modification Date Rev. Long Unsigned number of seconds between
|
||||
January 1, 1904, and the last modification
|
||||
of this file.
|
||||
Last Backup Date Rev. Long Unsigned number of seconds between
|
||||
January 1, 1904, and the last backup time
|
||||
of this file.
|
||||
Attributes Rev. Long 32 boolean flags. Once the bytes are
|
||||
unreversed, bit zero is the locked bit and
|
||||
bit one is the protected bit.
|
||||
|
||||
MS-DOS:
|
||||
|
||||
Modification Date Rev. 4 Bytes MS-DOS format modification date.
|
||||
Attributes Rev. 2 Bytes MS-DOS attributes.
|
||||
|
||||
Unix:
|
||||
|
||||
Create Date/Time Rev. 4 Bytes Unix creation date and time.
|
||||
Last Use Date/Time Rev. 4 Bytes Unix time for the last
|
||||
time this file was used.
|
||||
Last Mod. Date/Time Rev. 4 Bytes Unix time for the last
|
||||
time this file was modified.
|
||||
|
||||
|
||||
The Finder Info Entry:
|
||||
|
||||
The Finder Info entry (Entry ID = 9) is for files where the host file system is
|
||||
Macintosh. It consists of 16 bytes of Finder Info followed by 16 bytes of
|
||||
Extended Finder Info. These are the fields ioFlFndrInfo followed by
|
||||
ioFlXFndrInfo, as described in Inside Macintosh, Volume IV-183. Newlycreated
|
||||
files have zeroes in all Finder Info subfields. If you are creating an
|
||||
AppleDouble file whose home system is Macintosh, you may zero all unknown
|
||||
fields, but you may want to set the fdType and fdCreator subfields.
|
||||
|
||||
|
||||
The Data Pathname Entry:
|
||||
|
||||
The Data Pathname entry (Entry ID = 100) is defined for the first time inthis
|
||||
Note. It consists of a class one GS/OS input string noting the pathname of the
|
||||
AppleDouble Data File as originally created:
|
||||
|
||||
Path Length Rev. Word The length of the pathname.
|
||||
Pathname Bytes ASCII pathname of the AppleDouble Data File
|
||||
when created.
|
||||
|
||||
For strategies on using this segment (or not using it) to find theAppleDouble
|
||||
Data File, see the section "Finding the AppleDouble Data File."
|
||||
|
||||
|
||||
The Entries in the Header File:
|
||||
|
||||
The entries themselves follow the header field and the entry descriptors.The
|
||||
actual data representing each entry must be in a single, contiguous block. The
|
||||
offset field in that entry's descriptor points to it. The entries could appear
|
||||
in any order, but since the data fork is the entry that is most commonly
|
||||
extended, Apple strongly recommends that the data fork always bekept last in the
|
||||
file to facilitate its extension. Apple also recommends that those entries that
|
||||
are most often read, such as Real Name, File Info (and Finder Info if present)
|
||||
be kept as close as possible to the header tomaximize the probability that a
|
||||
read of the first few blocks of the file retrieves these entries.
|
||||
|
||||
It is possible to have holes in the file (unused space between entries). To
|
||||
find the holes, you must take the list of entry descriptors and sort theminto
|
||||
increasing offset order. If the offset field of an entry is greater than the
|
||||
offset plus the length of the previous entry (sorted), then a hole exists
|
||||
between the entries. You can make use of such holes; for example, if afile's
|
||||
comment is ten bytes long, you could create a hole of 190 bytes after the
|
||||
comment field to easily allow for the comment to later expand to its maximum
|
||||
length of 200 bytes. Because an AppleDouble file may contain holes, you must
|
||||
find each entry by getting its offset from its entry descriptor, not by assuming
|
||||
that it begins after the previous entry.
|
||||
|
||||
Byte ordering in file header fields follows 68000 convention, and each header
|
||||
field has been so noted by the Reverse operator.
|
||||
|
||||
|
||||
The AppleDouble Data File
|
||||
|
||||
The AppleDouble Data File is simply the data fork of the original file contained
|
||||
in a file of its own. You may create it with a File Type and Auxiliary Type
|
||||
assignment best suited to it, if desired. For example, if the program creating
|
||||
the AppleDouble Data File knows that the data fork contains strictly ASCII text,
|
||||
it could create the file with File Type $04 (Text File) so that other
|
||||
applications can deal with it accordingly.
|
||||
|
||||
If the creating program wishes to make no assumptions about the content ofthe
|
||||
data fork, it is encouraged to create the AppleDouble Data File with filetype
|
||||
$E0 and auxiliary type $0003. This identifies the file as an AppleDoubleData
|
||||
File.
|
||||
|
||||
|
||||
Identifying AppleDouble Files
|
||||
|
||||
As this is an interchange format, from a ProDOS directory entry there is no way
|
||||
to guarantee which files are AppleDouble files. Apple has allocated File Type
|
||||
$E0, Auxiliary Type $0002 for files which are AppleDouble Header Files, and File
|
||||
Type $E0, Auxiliary Type $0003 for files which are AppleDouble Data Files. We
|
||||
strongly encourage ProDOS 8 and GS/OS applications to use these file type and
|
||||
auxiliary type assignments when creating AppleDouble files.
|
||||
|
||||
AppleDouble files which do not have file type $E0 and auxiliary type $0002 or
|
||||
$0003 can most easily be identified by opening them and attempting to interpret
|
||||
them. If it is not an AppleDouble Header File, the Magic Number is not
|
||||
contained in the first four bytes of the file. The chances that the file would
|
||||
begin with those four bytes and not be an AppleDouble Header File, on a purely
|
||||
random basis, are 4,294,967,295 to 1. The chances that both the Magic Number
|
||||
and the Version bytes would be the same in a non-AppleSingle file are roughly
|
||||
1.8 x 10^19 to 1.
|
||||
|
||||
|
||||
Finding the AppleDouble Data File
|
||||
|
||||
Since the AppleDouble Data File can be stored anywhere, with any file typeand
|
||||
auxiliary type, a program may have to make an effort to find it. Werecommend
|
||||
the following steps:
|
||||
|
||||
1. If the Data Pathname segment exists, use that pathname. If the
|
||||
path specified in the segment does not exist, extract the file
|
||||
name from the end of the pathname and look in the current
|
||||
directory for that file name.
|
||||
2. If Step 1 does not find the file (or if the Data Pathname segment
|
||||
does not exist), perform the appropriate Home File System
|
||||
algorithm (described below) to generate the name of the
|
||||
AppleDouble Data File from the AppleDouble Header File.
|
||||
3. If none of the file names generated in Step 2 are found, ask the
|
||||
user where the AppleDouble Data File is located.
|
||||
|
||||
|
||||
Filename Conventions:
|
||||
|
||||
Apple proposes the following standard for identifying AppleDouble Header File
|
||||
names and AppleDouble Data File names from the file's real name.
|
||||
|
||||
ProDOS:
|
||||
|
||||
To generate the AppleDouble Data File name, use character substitution or
|
||||
deletion to remove illegal characters, and use truncation if necessary to
|
||||
reduce the length of the name to two characters less than the maximum file
|
||||
name length. This would be a maximum of 13, since the maximum file name
|
||||
length is 15.
|
||||
|
||||
To generate the AppleDouble Header File name, prefix the AppleDouble DataFile
|
||||
name with the characters "R." (uppercase R period).
|
||||
|
||||
For example, the file name "This is a Foo File" could translate to an
|
||||
AppleDouble Data File Name of "THIS.IS.A.FOO." The AppleDouble Header File
|
||||
name would then be "R.THIS.IS.A.FOO."
|
||||
|
||||
Unix:
|
||||
|
||||
To generate the AppleDouble Data File name, use character substitution to
|
||||
replace any illegal characters with an underscore (_). Since different Unix
|
||||
systems have different requirements on maximum file name length, do not
|
||||
explicitly truncate the name to a specific length. Rather, allow the
|
||||
truncation to be done by the Unix functions create(), open(), etc.
|
||||
|
||||
To generate the AppleDouble Header File name, A/UX (Apple's implementation of
|
||||
Unix for Macintosh computers) prefixes a percent sign (%) to the AppleDouble
|
||||
Data File name. If necessary, truncate the last character to keep the file name
|
||||
within the legal length range. Other Unix systems may prefix adirectory name
|
||||
(e.g., ".AppleDouble/") to the AppleDouble Data File name to create the name of
|
||||
the AppleDouble Header File. In this scheme, all AppleDouble Header Files
|
||||
corresponding to AppleDouble Data files are kept together in a single
|
||||
subdirectory.
|
||||
|
||||
MS-DOS:
|
||||
|
||||
To generate the AppleDouble Data File name, use character substitution or
|
||||
deletion to remove illegal characters, and use truncation if necessary to
|
||||
reduce the length of the name to eight characters. Then add the MS-DOS
|
||||
extension that is most appropriate to the file (such as "TXT" for a pure text
|
||||
file).
|
||||
|
||||
To generate the AppleDouble Header File name, add the extension ".ADF" to the
|
||||
eight-character file name.
|
||||
|
||||
In any instance, most programs probably wish to display the names being used
|
||||
for both AppleDouble files, so that the user may keep track of them on disk.
|
||||
|
||||
AppleDouble name derivations will be defined for all other file systems of
|
||||
interest. This allows applications running on the foreign file system (and
|
||||
users as well) to see easily which files are AppleDouble pairs.Knowledgeable
|
||||
users, if they know the derivation, could rename or move the files so as to
|
||||
preserve the connection between the two. However, there is no guaranteed way to
|
||||
prevent one file of the pair from being inconsistently renamed, moved, or
|
||||
deleted.
|
||||
|
||||
|
||||
About AppleDouble 2.0
|
||||
|
||||
AppleDouble 2.0 is a revision to the original AppleDouble specification
|
||||
described in this Note. AppleDouble 2.0 comes closer to the ideal of an
|
||||
interchange format by allowing file information for multiple file systems in the
|
||||
same AppleDouble file.
|
||||
|
||||
AppleDouble 2.0 basically replaces the File Info entry (ID = 7) with a File
|
||||
Dates entry (ID = 8) and one or more host file system entries, such as a
|
||||
Macintosh File Info entry (ID = 10), a ProDOS File Info entry (ID = 11), or an
|
||||
MS-DOS File Info entry (ID = 12). Information on these entries and AppleDouble
|
||||
2.0 can be found in the AppleSingle/AppleDouble Formats for Foreign Files
|
||||
Developer's Note, available from APDA, AppleLink, and the Developer CD series.
|
||||
|
||||
|
||||
Further Reference
|
||||
_____________________________________________________________________________
|
||||
o Inside Macintosh, Volume IV
|
||||
o ProDOS 8 Technical Reference Manual
|
||||
o GS/OS Reference
|
||||
o AppleSingle/AppleDouble Formats for Foreign Files Developer's Note
|
||||
|
||||
</pre><hr>
|
||||
|
||||
<address>This document is Copyright by Apple Computer, Inc.</address>
|
||||
|
||||
<!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,255 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>FTN.e00005</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong></strong></font><br>
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
<h2>Apple II FTN - DiskCopy disk image</h2>
|
||||
<p><a href="index.htm">Back to nulib.com library</a></p>
|
||||
<hr><pre>
|
||||
Apple II
|
||||
File Type Notes
|
||||
_____________________________________________________________________________
|
||||
Developer Technical Support
|
||||
|
||||
File Type: $E0 (224)
|
||||
Auxiliary Type: $0005
|
||||
|
||||
Full Name: DiskCopy disk image
|
||||
Short Name: DiskCopy disk image
|
||||
|
||||
Written by: Matt Deatherage, Dave Lyons & Steve Christensen May 1992
|
||||
|
||||
Files of this type and auxiliary type contain disk images from Apple's
|
||||
DiskCopy program on the Macintosh.
|
||||
_____________________________________________________________________________
|
||||
|
||||
DiskCopy is a program written by Steve Christensen of Apple Computer, Inc.,
|
||||
for internal use in duplicating and distributing 3.5" floppy disks. Because
|
||||
of its utility in distributing disk images on the Macintosh, DiskCopy is used
|
||||
in several Apple developer products even though DiskCopy is not an official
|
||||
Apple product and is not supported as such.
|
||||
|
||||
Since the monthly Developer CD Series discs contain many DiskCopy disk images,
|
||||
and since the AppleShare and HFS FSTs in System Software 6.0 and later
|
||||
automatically translate DiskCopy files (HFS file type dImg and creator dCpy)
|
||||
to Apple II file type $E0 and auxiliary type $0005, the format is provided
|
||||
here for your utility use only. Apple does not guarantee that files not
|
||||
generated by DiskCopy will work with DiskCopy.
|
||||
|
||||
|
||||
DEFINITIONS
|
||||
|
||||
DiskCopy uses a simple checksum algorithm to help insure data integrity for
|
||||
archived disk images. The algorithm for generating the 32-bit checksum is as
|
||||
follows:
|
||||
|
||||
Initialize checksum to zero
|
||||
For each data REVERSE WORD:
|
||||
Add the data REVERSE WORD to the checksum
|
||||
Rotate the 32-bit checksum right one bit (wrapping bit 0 to bit 31)
|
||||
|
||||
The following 65816 assembly language routine calculates a DiskCopy checksum.
|
||||
It's not a speedy operation--it takes about 12 seconds to calculate the
|
||||
checksum on an 800K disk image. Anyone finding an assembly routine that can
|
||||
perform this task in under 5 seconds may apply for their IIgs Certificate of
|
||||
Deityship, as documented in the File Type Note for file type $B6.
|
||||
|
||||
(Oh, by the way, any entries have to be under 1K in size--the following
|
||||
routine is 88 bytes. So don't think unwinding loops is your ticket to fame
|
||||
and fortune.)
|
||||
|
||||
****************************************************************************
|
||||
*
|
||||
* Compute checksum for DiskCopy data
|
||||
*
|
||||
* v1.2 by David A. Lyons, 18-May-92
|
||||
*
|
||||
* MPW IIgs assembly format
|
||||
*
|
||||
* Inputs on stack:
|
||||
* Push pointer to data (long)
|
||||
* Push size of data (long) (Must be even!)
|
||||
* JSL CalcChecksum
|
||||
* STA TheChecksum+2
|
||||
* STX TheChecksum
|
||||
*
|
||||
* Output:
|
||||
* Checksum in A and X (bytes +0 and +1 in X, bytes +2 and +3 in A)
|
||||
* (The inputs have been removed from the stack)
|
||||
*
|
||||
****************************************************************************
|
||||
CalcChecksum PROC
|
||||
phd ;save caller's direct page reg
|
||||
lda #0
|
||||
pha
|
||||
pha ;push initial checksum value (zero)
|
||||
tsc
|
||||
tcd
|
||||
|
||||
checksum equ 1
|
||||
oldD equ checksum+4
|
||||
theRTL equ oldD+2
|
||||
dataSize equ theRTL+3
|
||||
dataPtr equ dataSize+4
|
||||
|
||||
*** Set dataSize to -(dataSize/2)-1 so we can count up by one
|
||||
*** (instead of down by two) to see when we're done
|
||||
lda <dataSize+2
|
||||
lsr a
|
||||
eor #$ffff
|
||||
sta <dataSize+2
|
||||
lda <dataSize
|
||||
ror a
|
||||
eor #$ffff
|
||||
sta <dataSize
|
||||
|
||||
ldy #0
|
||||
nextWord inc <dataSize
|
||||
bne moreData
|
||||
inc <dataSize+2
|
||||
beq noMoreData
|
||||
moreData
|
||||
|
||||
*** Get next 16-bit word from the data buffer
|
||||
lda [<dataPtr],y
|
||||
xba ;swap to 65816 byte order
|
||||
|
||||
*** Add the data word to the checksum
|
||||
clc
|
||||
adc <checksum
|
||||
sta <checksum
|
||||
bcc noCksumRoll
|
||||
inc <checksum+2
|
||||
noCksumRoll
|
||||
*** Rotate the 32-bit checksum right one bit, wrapping bit 0 into bit 31
|
||||
lda <checksum+2
|
||||
lsr a
|
||||
ror <checksum
|
||||
bcc bit0was0
|
||||
ora #$8000 ;if we rotated a 1 out of bit 0,
|
||||
bit0was0 sta <checksum+2 ; then set bit 31
|
||||
|
||||
*** Advance to the next word and go back for more
|
||||
iny
|
||||
iny
|
||||
bne nextWord ;go back for more data
|
||||
inc <dataPtr+2
|
||||
bra nextWord ;go back for next bank of data
|
||||
|
||||
noMoreData pla
|
||||
xba
|
||||
tay
|
||||
pla
|
||||
xba
|
||||
tax ;pull checksum into YX (put in 68000
|
||||
order)
|
||||
|
||||
pld ;restore caller's direct page reg
|
||||
|
||||
lda 2,s
|
||||
sta 2+8,s
|
||||
lda 1,s
|
||||
sta 1+8,s
|
||||
pla
|
||||
pla
|
||||
pla
|
||||
pla ;discard input values
|
||||
|
||||
tya
|
||||
rtl
|
||||
|
||||
EndP
|
||||
|
||||
END
|
||||
|
||||
The following definition is used in this document in addition to those defined
|
||||
for all Apple II file types:
|
||||
|
||||
Checksum A 32-byte quantity calculated using the previously-defined
|
||||
algorithm. When these are contained in the file, they are in
|
||||
REVERSE order.
|
||||
|
||||
|
||||
FILE STRUCTURE
|
||||
|
||||
All of the information for a DiskCopy disk image is in the data fork. The
|
||||
resource fork usually contains Macintosh resources (in Macintosh resource fork
|
||||
format), including vers resources listing the checksums. This allows
|
||||
Macintosh users to use the Macintosh Finder's "Get Info..." function to
|
||||
quickly examine the checksums.
|
||||
The File Format
|
||||
|
||||
Because this is a native Macintosh file format, all the multi-byte constants
|
||||
are stored in Reverse order.
|
||||
|
||||
diskName (+000) 64 Bytes A Pascal String containing the name of the
|
||||
disk. This field takes 64 bytes
|
||||
regardless of the length of the String.
|
||||
dataSize (+064) Rev. Long The number of bytes (not blocks) of user
|
||||
data. User data is the 512 bytes of each
|
||||
block that a normal block-reading command
|
||||
returns.
|
||||
tagSize (+068) Rev. Long The number of bytes of tag data. Tag data
|
||||
is the extra 12 bytes of "scavenger"
|
||||
information present on 400K and 800K
|
||||
Macintosh disks. Apple II operating
|
||||
systems always leave these bytes zeroed,
|
||||
and they're not present on 720K or 1440K
|
||||
disks. If there are no tag bytes, this
|
||||
field will be zero.
|
||||
dataChecksum (+072) Checksum Checksum of all the user data on the disk.
|
||||
The checksum algorithm is called for the
|
||||
entire disk, not on a block-by-block or
|
||||
sector-by-sector basis. This is in
|
||||
Reverse order (most significant byte
|
||||
first).
|
||||
tagChecksum (+076) Checksum Checksum of all the tag data on the disk.
|
||||
If there is no tag data, this should be
|
||||
zero. This is in Reverse order (most
|
||||
significant byte first).
|
||||
diskFormat (+080) Byte 0 = 400K
|
||||
1 = 800K
|
||||
2 = 720K
|
||||
3 = 1440K (all other values are reserved)
|
||||
formatByte (+081) Byte $12 = 400K
|
||||
$22 = >400K Macintosh (DiskCopy uses this
|
||||
value for all Apple II disks not
|
||||
800K in size, and even for some of
|
||||
those)
|
||||
$24 = 800K Apple II disk
|
||||
private (+082) Rev. Word Must be $0100. If this field is not
|
||||
$0100, the file may be in a different
|
||||
format.
|
||||
userData (+084) dataSize Bytes
|
||||
The data blocks for the disk. These are
|
||||
in order from block zero through the end
|
||||
of the disk.
|
||||
tagData (+xxx) tagSize Bytes The tag data for this disk, starting with
|
||||
the tag data for the first block and
|
||||
proceeding in order. This field is not
|
||||
present for 720K and 1440K disks, but it
|
||||
is present for all other formats even if
|
||||
all the data is zeroes.
|
||||
Further Reference
|
||||
_____________________________________________________________________________
|
||||
|
||||
o GS/OS Reference
|
||||
</pre><hr>
|
||||
|
||||
<address>This document is Copyright by Apple Computer, Inc.</address>
|
||||
|
||||
<!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,537 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>FTN.e08000</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong></strong></font><br>
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
<h2>Apple II FTN - Binary II File</h2>
|
||||
<p><a href="index.htm">Back to nulib.com library</a></p>
|
||||
<hr><pre>
|
||||
Apple II
|
||||
File Type Notes
|
||||
_____________________________________________________________________________
|
||||
Developer Technical Support
|
||||
|
||||
|
||||
File Type: $E0 (224)
|
||||
Auxiliary Type: $8000
|
||||
|
||||
Full Name: Binary II File
|
||||
Short Name: Binary II File
|
||||
|
||||
Written by: Matt Deatherage July 1989
|
||||
|
||||
Files of this type and auxiliary type contain other files with their
|
||||
attributes encoded in Binary II format.
|
||||
_____________________________________________________________________________
|
||||
|
||||
Binary II is a widely used and accepted standard for keeping file attributes
|
||||
with files as they are transferred, usually by modem or other form of
|
||||
telecommunication. Files that are known Binary II files should be written to
|
||||
disk with file type $E0 and auxiliary type $8000 as a clear indication to
|
||||
other programs that the file contains files with Binary II specifications.
|
||||
|
||||
Binary II was developed by Gary B. Little, author of the Point-To-Point
|
||||
communication's product and author of several Apple II reference books. He is
|
||||
also Apple's Product Manager for third-party Development Tools and Languages.
|
||||
Gary welcomes your comments and suggestions on the Binary II standard at the
|
||||
following address:
|
||||
|
||||
Gary B. Little
|
||||
3304 Plateau Drive
|
||||
Belmont, CA 94002
|
||||
|
||||
AppleLink: LITTLE
|
||||
AppleLink--Personal Edition: GaryLittle
|
||||
CompuServe: 70135,1007
|
||||
GEnie: GARY.LITTLE
|
||||
|
||||
|
||||
Why Binary II?
|
||||
|
||||
Transferring Apple II files in binary form to commercial information services
|
||||
and bulletin boards (referred to in this Note as "hosts") can be, to put it
|
||||
mildly, a frustrating exercise. Although most hosts are able to receive a
|
||||
file's data in binary form (using protocols such as XMODEM), they don't
|
||||
receive the file's all-important attribute bytes. All the common Apple II
|
||||
file system, notably the ProDOS file system, store the attributes inside the
|
||||
disk directory, not inside the file itself.
|
||||
|
||||
The ProDOS attributes are the access code, file type code, auxiliary type
|
||||
code, storage type code, date of creation and last modification, time of
|
||||
creation and last modification, the file size, and the name of the file
|
||||
itself. Under GS/OS, the same parameters exist for other file systems as well
|
||||
as file system-specific information and two-forked file information. It is
|
||||
usually not possible to use a ProDOS file's data without knowing the file's
|
||||
attributes (particularly the file type, auxiliary type, and size). Therefore,
|
||||
ProDOS files uploaded in binary format to a host are useless to those who
|
||||
download them. The same is true for DOS 3.3 and Pascal files.
|
||||
|
||||
Many Apple II communication programs use special protocols for transferring
|
||||
file attributes during a binary file transfer, but none of these protocols
|
||||
have been implemented by hosts. These programs are only useful for exchanging
|
||||
files with another Apple II running the same program.
|
||||
|
||||
Without a standard like Binary II, the only acceptable way to transfer an
|
||||
Apple II file to a host is to convert it into ASCII text before sending it.
|
||||
Such a text file would contain a listing of an AppleSoft program, or a series
|
||||
of Apple II monitor commands (e.g., 300:A4 32). Someone downloading a file
|
||||
can convert it to binary form using the AppleSoft EXEC command.
|
||||
|
||||
The main disadvantage of this technique is that the text version of the file
|
||||
is over three times the size of the original binary file, making it expensive
|
||||
(in terms of time and money) to upload and download. It is also awkward, and
|
||||
sometimes impossible, to perform the binary-to-text or text-to-binary
|
||||
conversion.
|
||||
|
||||
The solution to the problem is to upload an encoded binary file which contains
|
||||
not just the file's data, but the file's attributes as well. Someone
|
||||
downloading such a file can then use a conversion program to strip the
|
||||
attributes from the file and create a file with the required attributes.
|
||||
|
||||
This Note describes such a format: Binary II. The description of the format
|
||||
is detailed for the purpose of allowing software developers to implement it in
|
||||
Apple II communication programs.
|
||||
|
||||
|
||||
What Binary II is Not
|
||||
|
||||
Binary II is not an archival or compression standard. It is designed to be a
|
||||
simple method to keep the attributes normally in a disk file's directory entry
|
||||
with the file as it is transferred. Although multiple files may be placed
|
||||
together with Binary II, this is a matter of convenience for telecommunication
|
||||
programs.
|
||||
|
||||
A true archival standard must be designed as such, with the capability to
|
||||
manipulate files within the archive as well as linking them together
|
||||
(compressed or uncompressed) for transfer. NuFX (documented in Apple II File
|
||||
Type Note for File Type $E0, Auxiliary Type $8002) is a good example of a
|
||||
robust, full-featured Apple II archival standard.
|
||||
|
||||
Binary II is primarily designed to be added to and subtracted from files "on-
|
||||
the-fly" by telecommunication programs. Binary II files should only be found
|
||||
on disks when they are transferred by a telecommunication program that does
|
||||
not have Binary II capabilities, in which case a separate utility (such as
|
||||
Binary Library Utility by Floyd Zink, Jr.) must be used to extract the files.
|
||||
Telecommunication programs should be able to transfer files without Binary II
|
||||
processing, however, they should support Binary II processing as a default.
|
||||
|
||||
|
||||
The Binary II File Format
|
||||
|
||||
The Binary II form of a standard file consists of a 128-byte file information
|
||||
header followed by the file's data. The data portion of the file is padded
|
||||
with nulls ($00 bytes), if necessary, to ensure the data length is an even
|
||||
multiple of 128 bytes.
|
||||
|
||||
The file information header contains four ID bytes, the attributes of the file
|
||||
(in ProDOS 8 form), and some control information.
|
||||
|
||||
The structure of the header is as follows:
|
||||
|
||||
+000 ID Bytes 3 Bytes These three bytes are always $0A $47 $4C
|
||||
for identification purposes, so programs
|
||||
may recognize Binary II files as they are
|
||||
received.
|
||||
+003 Access Code Byte ProDOS 8 access byte.
|
||||
+004 File Type Byte ProDOS 8 file type.
|
||||
+005 Aux Type Word ProDOS 8 auxiliary type.
|
||||
+007 Storage Type Byte ProDOS 8 storage type value.
|
||||
+008 File Size Word The size of the file in 512-byte blocks.
|
||||
+010 Mod. Date 2 Bytes Date of modification, in ProDOS 8
|
||||
compressed format.
|
||||
+012 Mod. Time 2 Bytes Time of modification, in ProDOS 8
|
||||
compressed format.
|
||||
+014 Create Date 2 Bytes Date of creation, in ProDOS 8
|
||||
compressed format.
|
||||
+016 Create Time 2 Bytes Time of creation, in ProDOS 8
|
||||
compressed format.
|
||||
+018 ID Byte Byte A fourth ID byte. This must always be
|
||||
$02.
|
||||
+019 Reserved Byte Reserved, must be set to zero.
|
||||
+020 EOF 3 Bytes The end-of-file value for the file (low
|
||||
byte first).
|
||||
+023 File Name String Pascal string containing the ASCII
|
||||
filename or partial pathname of this file
|
||||
in ProDOS 8 format. The string cannot be
|
||||
longer than 64 characters.
|
||||
|
||||
If the File Name String is a filename and not a partial pathname, then the
|
||||
following optional parameter may be supplied:
|
||||
|
||||
+039 Native Name String Pascal string containing the
|
||||
ASCII value of the native filename. This
|
||||
string may not be longer than 48
|
||||
characters, and will not be present if the
|
||||
length byte of File Name (+023) is larger
|
||||
than 15 ($0F). If this field is
|
||||
specified, the File Name field must
|
||||
contain a filename, not a partial
|
||||
pathname.
|
||||
|
||||
+088 Reserved 21 Bytes Reserved. These bytes must be set to zero
|
||||
for future compatibility.
|
||||
|
||||
+109 GAux Type Word The high word of the file's GS/OS
|
||||
auxiliary type.
|
||||
+111 GAccess Byte The high byte of the file's GS/OS access
|
||||
word.
|
||||
+112 GFile Type Byte The high byte of the file's GS/OS
|
||||
file type.
|
||||
+113 GStorage Byte The high byte of the file's GS/OS storage
|
||||
type.
|
||||
+114 GFile Size Word The high word of the GS/OS file's
|
||||
size in 512-byte blocks.
|
||||
+116 GEOF Byte The high byte of the file's GS/OS EOF
|
||||
value.
|
||||
+117 Disk Space Long The number of 512-byte disk blocks
|
||||
the files inside the BinaryÊII file will
|
||||
occupy after they've been removed from the
|
||||
BinaryÊII file. (The format of a Binary
|
||||
II file containing multiple files is
|
||||
described later in this Note.) If the
|
||||
number is zero, the creator of the Binary
|
||||
II file didn't bother to calculate the
|
||||
space needed. This value must be placed
|
||||
in the file information header for the
|
||||
first file inside the Binary II file; it
|
||||
can be set to zero in subsequent headers.
|
||||
A downloading program can inspect Disk
|
||||
Space and abort the transfer immediately
|
||||
if there isn't enough free space on the
|
||||
disk.
|
||||
+121 OS Type Byte This value indicates the native operating
|
||||
system of the file:
|
||||
$00 ProDOS or SOS
|
||||
$01 DOS 3.3
|
||||
$02 Reserved
|
||||
$03 DOS 3.2 or DOS 3.1
|
||||
$04 Apple II Pascal
|
||||
$05 Macintosh MFS
|
||||
$06 Macintosh HFS
|
||||
$07 Lisa Filing System
|
||||
$08 Apple CP/M
|
||||
$09 Reserved (returned by the GS/OS
|
||||
Character FST)
|
||||
$0A MS-DOS
|
||||
$0B High Sierra (CD-ROM)
|
||||
$0C ISO 9660 (CD-ROM)
|
||||
$0D AppleShare
|
||||
Note this list is slightly different (in
|
||||
the first three entries) from the standard
|
||||
GS/OS file system ID list. A GS/OS
|
||||
communication program should not place a
|
||||
zero in this field unless the file's
|
||||
native file system truly is ProDOS. The
|
||||
file's native file system is returned in
|
||||
the file_sys_id parameter from the
|
||||
GetDirEntry call.
|
||||
+122 Native File Type
|
||||
Word This has meaning only if OS Type is non-
|
||||
zero. If so, it is set to the actual file
|
||||
type code assigned to the file by it's
|
||||
native operating system. (Some operating
|
||||
systems, such as MS-DOS and CP/M, do not
|
||||
use file type codes, however.) Contrast
|
||||
this with the File Type at +004, which is
|
||||
the closest equivalent ProDOS file type.
|
||||
The Native File Type is needed to
|
||||
distinguish files which have the same
|
||||
ProDOS file type, but which may have
|
||||
different file types in their native
|
||||
operating system. Note that if the file
|
||||
type code is only one byte long (the usual
|
||||
case), the high-order byte of Native File
|
||||
Type is set to zero.
|
||||
+124 Phantom File Flag
|
||||
Byte This byte indicates whether a receiver of
|
||||
the Binary II file should save the file
|
||||
which follows (flag is zero) or ignore it
|
||||
(flag is non-zero). It is anticipated
|
||||
that some communication programs will use
|
||||
phantom files to pass non-essential
|
||||
explanatory notes or encoded information
|
||||
which would be understood only by a
|
||||
receiver using the same communication
|
||||
program. Such programs must not rely on
|
||||
receiving a phantom file, however, since
|
||||
this would mean they couldn't handle
|
||||
Binary II files created by other
|
||||
communication programs. Phantom Files may
|
||||
also be used to pass extended file
|
||||
attributes when available.
|
||||
|
||||
The first two bytes in a phantom file must
|
||||
contain an ID code unique to the
|
||||
communication program, or a universal
|
||||
identifier concerning the contents of the
|
||||
phantom file. Developers must obtain ID
|
||||
codes from Gary Little to ensure
|
||||
uniqueness (see the beginning of this Note
|
||||
for his address). Here is a current list
|
||||
of approved ID codes for phantom files
|
||||
used by Apple II communication programs:
|
||||
$00 $00 ASCII text terminated with a
|
||||
zero byte.
|
||||
$00 $01 Point-to-Point
|
||||
$00 $02 Tele-Master Communications
|
||||
System
|
||||
$00 $03 ProTERM
|
||||
$00 $04 Modem MGR
|
||||
$00 $05 CommWorks
|
||||
$00 $06 MouseTalk
|
||||
$01 $00 Option_list data (see later in
|
||||
this Note).
|
||||
The ID bytes are the first two bytes of
|
||||
the phantom file.
|
||||
+125 Data Flags Bit 7: 1 = file is compressed
|
||||
Flag Byte Bit 6: 1 = file is encrypted
|
||||
Bits 5-1: Reserved
|
||||
Bit 0: 1 = file is sparse
|
||||
A Binary II downloading program can
|
||||
examine this byte and warn the user that
|
||||
the file must be expanded, decrypted or
|
||||
unpacked. The person uploading a Binary
|
||||
II file may use any convenient method for
|
||||
compressing, encrypting, or packing the
|
||||
file but is responsible for providing
|
||||
instructions on how to restore the file to
|
||||
its original state.
|
||||
+126 Version Byte This release of Binary II has a version
|
||||
number of $01.
|
||||
+127 Number of Files to Follow
|
||||
Byte An appealing feature of Binary II is that
|
||||
a single Binary II file can hold multiple
|
||||
disk files, making it easy to keep a group
|
||||
of related files "glued" together when
|
||||
they're sent to a host. This byte
|
||||
contains the number of files in this
|
||||
Binary II file that are behind it. If
|
||||
this is the first file in a Binary II file
|
||||
containing three disk files, this byte
|
||||
would be $02. The second disk file in the
|
||||
same Binary II file would have a value of
|
||||
$01 in this parameter, and the last would
|
||||
have value $00. This count tells the
|
||||
Binary II downloading program how many
|
||||
files are remaining. If any phantom files
|
||||
are included, they must be included in
|
||||
this count.
|
||||
|
||||
|
||||
Filenames and Partial Pathnames
|
||||
|
||||
You can put a standard ProDOS filename or a partial pathname in the file
|
||||
information header (but never a complete pathname). Don't use a partial
|
||||
pathname unless you've included, earlier in the Binary II file, file
|
||||
information headers for each of the directories referred to in the partial
|
||||
pathname. Such a header must have its "end of file position" bytes set to
|
||||
zero, and no data blocks for the subdirectory file must follow it.
|
||||
|
||||
For example, if you want to send a file whose partial pathname is
|
||||
HELP/GS/READ.ME, first send a file information header defining the HELP/
|
||||
subdirectory, then one defining the HELP/GS/ subdirectory. If you don't,
|
||||
someone downloading the Binary II file won't be able to convert it because the
|
||||
necessary subdirectories will not exist.
|
||||
|
||||
Note: GS/OS communication programs must use the slash (/) as the
|
||||
pathname's separator in any partial pathname it puts in the
|
||||
header. Since GS/OS's standard separator is the colon (:), a
|
||||
conversion may be necessary.
|
||||
|
||||
|
||||
Filename Convention
|
||||
|
||||
Whenever a file is sent to a host, the host asks the sender to provide a name
|
||||
for it. If it's a file in Binary II form, the name provided should end in
|
||||
.BNY so its special form will be apparent to anyone viewing a list of
|
||||
filenames. If the file is compacted (using the public-domain Squeeze
|
||||
algorithm) before being converted to Binary II form, use a .BQY suffix
|
||||
instead. If the file is a NuFX archive, use the suffix .BXY.
|
||||
|
||||
|
||||
Identifying Binary II Files
|
||||
|
||||
You can determine, while transferring, if a file is in Binary II form by
|
||||
examining the ID bytes at offsets +000, +001, +002 and +018 from the beginning
|
||||
of the file. They must be $0A, $47, $4C and $02, respectively.
|
||||
|
||||
Once Binary II files are identified, you can use the data in the file
|
||||
information header to create and open a ProDOS file with the correct name and
|
||||
attributes, transfer the file data in the Binary II file to the ProDOS file,
|
||||
set the ProDOS file size, then close the ProDOS file. You would repeat this
|
||||
for each file contained inside the Binary II file.
|
||||
|
||||
Note: The number of 128-byte blocks following the file information
|
||||
header must be derived from the EOF attribute for the file.
|
||||
Calculate the number by dividing the EOF by 128 and adding one to
|
||||
the result if EOF is not 0 or an exact multiple of 128. However,
|
||||
if the file information header defines a subdirectory (the file
|
||||
type is $0F), simple create the subdirectory file. Do not open it
|
||||
and do not try to set its size.
|
||||
|
||||
Ideally, all this conversion work will be done automatically by a
|
||||
communication program during file transfer. If not, a separate conversion
|
||||
program (such as the previously mentioned Binary Library Utility, or BLU) must
|
||||
be used to do this for you.
|
||||
|
||||
|
||||
Option_List Phantom Files
|
||||
|
||||
GS/OS will return, when asked, an option_list for files on many file calls.
|
||||
The option_list consists of a Word buffer length (which must be at least $2E),
|
||||
followed by a Word number of bytes GS/OS put in the buffer, a Word GS/OS file
|
||||
system identification, and the given number of bytes of FST-specific
|
||||
information (minus two; the count GS/OS returns includes the file system
|
||||
identifier).
|
||||
|
||||
Option_list values are FST specific and contain values important to the native
|
||||
file system but not important to GS/OS. For AppleShare, the option_list
|
||||
contains Finder Information, parent directory identification, and access
|
||||
privileges. This information should be transferred with files.
|
||||
|
||||
Binary II uses a phantom file with identifier $01 $00 to indicate an
|
||||
option_list. When this phantom file is seen, the contents should be used as
|
||||
the option_list for the file that immediately follows this file in the
|
||||
Binary II file. The other attributes of the phantom file must be set to the
|
||||
same values as those for the file immediately following (the file for which
|
||||
the phantom file contains the option_list). The EOF for the phantom file must
|
||||
be the size of the option_list + 2, and the file size must be adjusted
|
||||
accordingly to account for the phantom file ID bytes.
|
||||
|
||||
When receiving a Binary II file, the contents of this phantom file should be
|
||||
used as option_list input on a GS/OS SetFileInfo call.
|
||||
|
||||
If the GS/OS option_list returns a total of two bytes (just the file_sys_ID),
|
||||
there is no FST-specific information, and the option_list phantom file may
|
||||
safely be omitted.
|
||||
|
||||
The format of the option_list phantom file is as follows:
|
||||
|
||||
+000 Phantom ID 2 Bytes The identifying bytes $01 $00.
|
||||
+002 List Size Word The length of the bytes in the
|
||||
option_list, starting with the file system
|
||||
ID (the next word).
|
||||
+004 FileSysID Word A GS/OS (not Binary II) file_sys_ID for
|
||||
the volume on which the file was stored.
|
||||
+006 List Bytes Bytes The bytes of the option list.
|
||||
There should be (List Size) of them,
|
||||
counting the previous word (FileSysID).
|
||||
|
||||
|
||||
Extended File Considerations
|
||||
|
||||
Extended files contain two logical segments: a data fork and a resource fork.
|
||||
These files can be created and manipulated by GS/OS, but not by ProDOS 8 or
|
||||
any other Apple II operating system.
|
||||
|
||||
When a GS/OS-based communication program sends an extended file, it must send
|
||||
it in the AppleSingle file format, preceded by a Binary II file information
|
||||
header. (Such a program could easily convert an extended file to AppleSingle
|
||||
format on the fly.) The Binary II header must contain the attributes of the
|
||||
AppleSingle file (including a file type of $E0 and an auxiliary type of $0001)
|
||||
and the "storage type code" field must be $01. (The EOF positions for the
|
||||
data fork and resource fork of the extended file appear in an entry in the
|
||||
AppleSingle file header, not in the Binary II header.)
|
||||
|
||||
The AppleSingle format is described in Apple II File Type Note for File Type
|
||||
$E0, Auxiliary Type $0001.
|
||||
|
||||
A GS/OS-based communication program that receives an AppleSingle file can
|
||||
easily convert it on the fly to the extended file it defines. ProDOS 8-based
|
||||
communication programs can only save the AppleSingle file to disk because it's
|
||||
not possible (nor is it encouraged to attempt) to create extended files with
|
||||
ProDOS 8 (without using block-level calls); a GS/OS based utility program is
|
||||
needed to convert the AppleSingle file to its extended form.
|
||||
|
||||
|
||||
DOS 3.3 Considerations
|
||||
|
||||
With a little extra effort, you can also convert DOS 3.3 files to Binary II
|
||||
form. This involves translating the DOS 3.3 file attributes to the
|
||||
corresponding ProDOS attributes so that you can build a proper file
|
||||
information header.
|
||||
|
||||
o Set the name to one that adheres to the stricter ProDOS naming
|
||||
rules and put its length at +023 and the name itself at +024 to
|
||||
+038. Note that the name must be a simple filename and not a
|
||||
pathname. The actual DOS 3.3 filename must be placed at +039
|
||||
(length) and +040 to +087 (name). (DOS 3.3 actually restricts
|
||||
filenames to 30 characters.)
|
||||
|
||||
o Set the ProDOS file type, auxiliary type and access to values
|
||||
which correspond to the DOS 3.3 file type:
|
||||
|
||||
DOS 3.3 ProDOS ProDOS ProDOS
|
||||
File Type File Type Auxiliary Type Access
|
||||
__________________________________________________
|
||||
$00 (T) $04 $0000 $E3
|
||||
$80 (*T) $04 $0000 $21
|
||||
$01 (I) $FA $0C00 $E3
|
||||
$81 (*I) $FA $0C00 $21
|
||||
$02 (A) $FC * $E3
|
||||
$82 (*A) $FC * $21
|
||||
$04 (B) $06 ** $E3
|
||||
$84 (*B) $06 ** $21
|
||||
$08 (S) $06 $0000 $E3
|
||||
$88 (*S) $06 $0000 $21
|
||||
$10 (R) $FE $0000 $E3
|
||||
$90 (*R) $FE $0000 $21
|
||||
$20 (A) $06 $0000 $E3
|
||||
$A0 (*A) $06 $0000 $E3
|
||||
$40 (B) $06 $0000 $E3
|
||||
$C0 (*B) $06 $0000 $21
|
||||
__________________________________________________
|
||||
|
||||
* Set the auxiliary type for an A file to the
|
||||
memory address from which the program was saved.
|
||||
This is usually $0801.
|
||||
** Set the auxiliary type for a B file to the
|
||||
value stored in the first two bytes of the the
|
||||
file (this is the default load address).
|
||||
|
||||
o Set the storage type code to $01.
|
||||
o Set the size of file in blocks, date of creation, date of
|
||||
modification, time of creation and time of modification all to
|
||||
$0000.
|
||||
o Set the end-of-file position to the length of the DOS 3.3 file, in
|
||||
bytes. For a B file (code $04 or $84), this number is stored in
|
||||
the third and fourth bytes of the file. For an I file (code $01
|
||||
or $81) or an A file (code $02 or $82), this number is stored in
|
||||
the first and second bytes of the file.
|
||||
o Set the operating system type to $01.
|
||||
o Set the native file type code to the value of the DOS 3.3 file
|
||||
type code.
|
||||
|
||||
Attribute bytes inside a DOS 3.3 file (if any) must not be included in the
|
||||
data portion of the Binary II file. This includes the first four bytes of a B
|
||||
(Binary) file, and the first two bytes of an A (AppleSoft) or I (Integer
|
||||
BASIC) file.
|
||||
|
||||
|
||||
Further Reference
|
||||
_____________________________________________________________________________
|
||||
o GS/OS Reference
|
||||
o ProDOS 8 Technical Reference Manual
|
||||
o Apple II File Type Note, File Type $E0, Auxiliary Type $0001
|
||||
o Apple II File Type Note, File Type $E0, Auxiliary Type $8002
|
||||
o Apple II Miscellaneous Technical Note #14, Guidelines for
|
||||
Telecommunication Programs
|
||||
</pre><hr>
|
||||
|
||||
<address>This document is Copyright by Apple Computer, Inc.</address>
|
||||
|
||||
<!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,966 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>FTN.e08002</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong></strong></font><br>
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
<h2>Apple II FTN - ShrinkIt (NuFX) document</h2>
|
||||
<p><a href="index.htm">Back to nulib.com library</a></p>
|
||||
<h3>NOTE to CRC-16 seekers:</h3>
|
||||
<p>Looks like a lot of people are hitting this page while looking for a CRC-16
|
||||
algorithm. That's not what this page is about. If you want a CRC-16
|
||||
implementation in C, try <a href="Crc16.c.txt">this one</a>.
|
||||
If you want one in 6502 assembly, skip down to the end of this document.
|
||||
<p>
|
||||
<hr><pre>
|
||||
Apple II
|
||||
File Type Notes
|
||||
_____________________________________________________________________________
|
||||
Developer Technical Support
|
||||
|
||||
File Type: $E0 (224)
|
||||
Auxiliary Type: $8002
|
||||
|
||||
Full Name: NuFile Exchange Archival Library
|
||||
Short Name: ShrinkIt (NuFX) document
|
||||
|
||||
Revised by: Andy Nicholas and Matt Deatherage July 1990
|
||||
Written by: Matt Deatherage July 1989
|
||||
|
||||
Files of this type and auxiliary type contain NuFX Archival Libraries.
|
||||
Changes since July 1989: Rewrote major portions to reflect Master Version
|
||||
$0002 of the NuFX standard.
|
||||
_____________________________________________________________________________
|
||||
|
||||
Introduction
|
||||
|
||||
NuFX is a robust, full-featured archival standard for the Apple II family.
|
||||
The standard, as presented in this Note, allows for full archival of ProDOS
|
||||
and GS/OS files while keeping all file attributes with each file, as well as
|
||||
providing necessary archival functions such as multiple compression schemes
|
||||
and multiple archival implementations of the same standard. NuFX is
|
||||
implemented in the application ShrinkIt, a free archival utility program for
|
||||
enhanced IIe, IIc and IIgs computers. (Versions for earlier Apple II models
|
||||
are also available.)
|
||||
|
||||
The NuFX standard was developed by Andrew Nicholas for Paper Bag Productions.
|
||||
Comments or suggestions on the NuFX standard, or comments and suggestions on
|
||||
ShrinkIt are welcome at:
|
||||
|
||||
Paper Bag Productions
|
||||
8415 Thornberry Drive East
|
||||
Upper Marlboro, MD 20772
|
||||
Attn: NuFX Technical Support
|
||||
America Online: ShrinkIt
|
||||
GEnie: ShrinkIt
|
||||
CompuServe: 70771,2615
|
||||
|
||||
|
||||
History
|
||||
|
||||
The Apple II community has always lacked a well-defined method for archiving
|
||||
files. NuFX is an attempt to rectify the situation by providing a flexible,
|
||||
consistent standard for archiving files, disks, and other computer media.
|
||||
Although many files are archived using the Binary II standard (see Apple II
|
||||
File Type Note, File Type $E0, Auxiliary Type $8000), it was not designed as
|
||||
an archival standard and its continued use as such creates problems. More
|
||||
people are using Binary II as an archival standard than as a way to keep
|
||||
attributes with a file when transferred, and this use is causing the original
|
||||
intent of Binary II to become lost and unused.
|
||||
|
||||
NuFX, developed as an archival standard for the days of GS/OS, allows:
|
||||
|
||||
o Filenames longer than 64 characters (GS/OS can create 8,000-
|
||||
character filenames).
|
||||
o A convenient way to add to, remove from, and work on an archive.
|
||||
o Including GS/OS files which contain resource forks.
|
||||
o Including entire disk images.
|
||||
o Including comments with a file.
|
||||
o A convenient way to represent a file compressed or encrypted by a
|
||||
specific application.
|
||||
o A true archive standard. Binary IIs original intent was to make
|
||||
transfer of Apple II files from local machines to large
|
||||
information services possible; otherwise, a file's attribute
|
||||
information would be lost. Use of Binary II to archive files
|
||||
rather than simply maintain their attributes stretches it beyond
|
||||
its original intent.
|
||||
|
||||
Adding all of these features to the existing Binary II standard would be
|
||||
nearly impossible without violating the existing standard and causing a great
|
||||
deal of confusion. Although Binary II is flexible, it is simply unable to
|
||||
address all of these concerns without alienating existing Binary II extraction
|
||||
programs.
|
||||
|
||||
To provide some differentiation between standards and provide a better
|
||||
functioning format, this Note presents a new standard called NuFX (NuFile
|
||||
eXchange for the Apple II; pronounced new-F-X). NuFX fixes the problems that
|
||||
Apple IIgs users would soon be experiencing as other filing systems become
|
||||
available for GS/OS. NuFX attempts to stem a set of problems before they have
|
||||
a chance to develop. NuFX provides all of the features of Binary II, but goes
|
||||
further to allow the user the ultimate in flexibility, usefulness and
|
||||
performance.
|
||||
|
||||
|
||||
Additional Date/Time Data type:
|
||||
|
||||
Date/Time (8 Bytes):
|
||||
|
||||
+000 second Byte The second, 0 through 59.
|
||||
+001 minute Byte The minute, 0 through 59.
|
||||
+002 hour Byte The hour, 0 through 23.
|
||||
+003 year Byte The current year minus 1900.
|
||||
+004 day Byte The day, 0 through 30.
|
||||
+005 month Byte The month, 0 through 11 (0 = January).
|
||||
+006 filler Byte Reserved, must be zero.
|
||||
+007 weekDay Byte The day of the week, 1 through 7 (1 = Sunday).
|
||||
|
||||
The format of the Date/Time field is identical to that described for the
|
||||
ReadTimeHex call in the Apple IIgs Toolbox Reference Manual.
|
||||
|
||||
|
||||
Implementation
|
||||
|
||||
Figure 1 illustrates the basic structure of a NuFX archive.
|
||||
|
||||
| First Record | Next Record |
|
||||
_______________|_______________________|_______________________|
|
||||
| Master Header | Header | Data | Header | Data |
|
||||
|_______________|________|______________|________|______________|
|
||||
|
||||
Figure 1-NuFX Archive Structure
|
||||
|
||||
A single master header block contains values which describe the entire archive
|
||||
(those with knowledge of structured programming may consider them archive
|
||||
globals). Each of the succeeding header blocks contains only information
|
||||
about the record it precedes (consider each an archive local).
|
||||
|
||||
Each header block is followed by a list of threads, which is followed by the
|
||||
actual threads. The data for each thread may be a data fork, resource fork,
|
||||
message, control sequence for a NuFX utility program, or almost any kind of
|
||||
sequential data.
|
||||
|
||||
Possible Block Combinations:
|
||||
|
||||
The blocks must occur in the following fashion:
|
||||
|
||||
Master Header Block containing N entries
|
||||
|
||||
Header Block
|
||||
Threads list:
|
||||
filename_thread (16 bytes)
|
||||
message_thread (16 bytes)
|
||||
data thread (16 bytes)
|
||||
.
|
||||
.
|
||||
.
|
||||
filename_thread's data (filename_thread's comp_thread_eof # of bytes)
|
||||
message_thread's data (message_thread's comp_thread_eof # of bytes)
|
||||
data_thread's data (data_thread's comp_thread_eof # of bytes)
|
||||
.
|
||||
.
|
||||
.
|
||||
Next Header Block (notice no second Master Header block)
|
||||
Threads list (message, control, data or resource)
|
||||
.
|
||||
.
|
||||
.
|
||||
Nth Header Block
|
||||
Threads list (message, control, data or resource)
|
||||
|
||||
Master Header Block Contents
|
||||
|
||||
+000 nufile_id 6 Bytes These six bytes spell the word "NuFile" in
|
||||
alternating ASCII (low, then high) for
|
||||
uniqueness. The six bytes are $4E $F5 $46
|
||||
$E9 $6C $E5.
|
||||
+006 master_crc Word A 16-bit cyclic redundancy check
|
||||
(CRC) of the remaining fields in this
|
||||
block (bytes +008 through +047). Any
|
||||
programs which modify the master header
|
||||
block must recalculate the CRC for the
|
||||
master header. (see the section "A Sample
|
||||
CRC Algorithm") The initial value of this
|
||||
CRC is $0000.
|
||||
+008 total_records Long The total number of records in this
|
||||
archive file. It is possible to chain
|
||||
multiple records (files or disks)
|
||||
together, as it is possible to chain
|
||||
different types of records together (mixed
|
||||
files and disks).
|
||||
+012 archive_create_when
|
||||
Date/Time The date and time on which this archive
|
||||
was initially created. This field should
|
||||
never be changed once initially written.
|
||||
If the date is not known, or is unable to
|
||||
be calculated, this field should be set to
|
||||
zero. If the weekday is not known, or is
|
||||
unable to be calculated, this field should
|
||||
be set to null.
|
||||
+020 archive_mod_when
|
||||
Date/Time The date of the last modification to this
|
||||
archive. This field should be changed
|
||||
every time a change is made to any of the
|
||||
records in the archive. If the date is
|
||||
not known, or is unable to be calculated,
|
||||
this field should be set to zero. If the
|
||||
weekday is not known, or is unable to be
|
||||
calculated, this field should be set to
|
||||
null.
|
||||
+028 master_version
|
||||
Word The master version number of the NuFX
|
||||
archive. This Note describes
|
||||
master_version $0002, for which the next
|
||||
eight bytes are zeroed.
|
||||
+030 reserved 8 Bytes Must be null ($00000000).
|
||||
+038 master_eof Long The length of the NuFX archive, in
|
||||
bytes. Any programs which modify the
|
||||
length of an archive, either increasing it
|
||||
or decreasing it in size, must change this
|
||||
field in the master header to reflect the
|
||||
new size.
|
||||
|
||||
Header Block Contents:
|
||||
|
||||
Following the Master Header block is a regular Header Block, which precedes
|
||||
each record within the NuFX archive. A cyclic redundancy check (CRC) has been
|
||||
provided to detect archives which have possibly been corrupted. The only time
|
||||
the CRC should be included in a block is for the Master Header and for each of
|
||||
the regular Header Blocks. The CRC ensures reliability and data integrity.
|
||||
|
||||
+000 nufx_id 4 Bytes These four bytes spell the word "NuFX" in
|
||||
alternating ASCII (low, then high) for
|
||||
uniqueness. The four bytes are $4E $F5
|
||||
$46 $D8.
|
||||
+004 header_crc Word The 16-bit CRC of the remaining
|
||||
fields of this block (bytes +006 through
|
||||
the end of the header block and any
|
||||
threads following it). This field is used
|
||||
to verify the integrity of the rest of the
|
||||
block. Programs which create NuFX
|
||||
archives must include this in every
|
||||
header. It is up to the discretion of the
|
||||
extracting program to check the validity
|
||||
of this CRC. Any programs which might
|
||||
modify the header of a particular record
|
||||
must recalculate the CRC for the header
|
||||
block. The initial value for this CRC is
|
||||
zero ($0000).
|
||||
+006 attrib_count Word This field describes the length of
|
||||
the attribute section of each record in
|
||||
bytes. This count measures the distance
|
||||
in bytes from the first field (offset
|
||||
+000) up to and including the
|
||||
filename_length field. By convention, the
|
||||
filename_length field will always be the
|
||||
last 2 bytes of the attribute section
|
||||
regardless of what has preceded it.
|
||||
+008 version_number
|
||||
Word Version of this record. If version_number
|
||||
is $0000, no option_list fields are
|
||||
present. If the version_number is $0001
|
||||
option_list fields may be present. If the
|
||||
version_number is $0002 then option_list
|
||||
fields may be present and a valid CRC-16
|
||||
exists for the compressed data in the data
|
||||
threads of this record. If the
|
||||
version_number is $0003 then option_list
|
||||
fields may be present and a valid CRC-16
|
||||
exists for the uncompressed data in the
|
||||
data threads of this record. The current
|
||||
version number is $0003 and should always
|
||||
be used when making archives.
|
||||
+010 total_threads Long The number of thread subrecords
|
||||
which should be expected immediately
|
||||
following the filename or pathname at the
|
||||
end of this header block. This field is
|
||||
extremely important as it contains the
|
||||
information about the length of the last
|
||||
third of the header.
|
||||
+014 file_sys_id Word The native file system identifier:
|
||||
$0000 reserved
|
||||
$0001 ProDOS/SOS
|
||||
$0002 DOS 3.3
|
||||
$0003 DOS 3.2
|
||||
$0004 Apple II Pascal
|
||||
$0005 Macintosh HFS
|
||||
$0006 Macintosh MFS
|
||||
$0007 Lisa File System
|
||||
$0008 Apple CP/M
|
||||
$0009 reserved, do not use (The
|
||||
GS/OS Character FST returns
|
||||
this value)
|
||||
$000A MS-DOS
|
||||
$000B High Sierra
|
||||
$000C ISO 9660
|
||||
$000D AppleShare
|
||||
$000E-$FFFF Reserved, do not use
|
||||
If the file system of a disk being
|
||||
archived is not known, it should be set to
|
||||
zero.
|
||||
+016 file_sys_info Word Information about the current filing
|
||||
system. The low byte of this word (offset
|
||||
+016) is the native file system separator.
|
||||
For ProDOS, this is the slash (/ or $2F).
|
||||
For HFS and GS/OS, the colon (: or $3F) is
|
||||
used, and for MS-DOS, the separator is the
|
||||
backslash (\ or $5C). This separator is
|
||||
provided so archival utilities may know
|
||||
how to parse a valid file or pathname from
|
||||
the filename field for the receiving file.
|
||||
GS/OS archival utilities should not
|
||||
attempt to parse pathnames, as it is not
|
||||
possible to build in syntax rules for file
|
||||
systems not currently defined. Instead,
|
||||
pass the pathname directory to GS/OS and
|
||||
attempt translation (asking the user for
|
||||
suggestions) only if GS/OS returns an
|
||||
"Invalid Path Name Syntax" error. The
|
||||
high byte of this word is reserved and
|
||||
should remain zero.
|
||||
+018 access Flag Long Bits 31-8 reserved, must be zero
|
||||
Bit 7 (D) 1 = destroy enabled
|
||||
Bit 6 (R) 1 = rename enabled
|
||||
Bit 5 (B) 1 = file needs to be
|
||||
backed up
|
||||
Bits 4-3 reserved, must be zero
|
||||
Bit 2 (I) 1 = file is invisible
|
||||
Bit 1 (W) 1 = write enabled
|
||||
Bit 0 (R) 1 = read enabled
|
||||
+022 file_type Long The file type of the file being archived.
|
||||
For ProDOS 8 or GS/OS, this field should
|
||||
always be what the operating system
|
||||
returns when asked. For disks being
|
||||
archived, this field should be zero.
|
||||
+026 extra_type Long The auxiliary type of the file being
|
||||
archived. For ProDOS 8 or GS/OS, this
|
||||
field should always be what the operating
|
||||
system returns when asked. For disks
|
||||
being archived, this field should be the
|
||||
total number of blocks on the disk.
|
||||
+030 storage_type Word For Files: The storage type of the
|
||||
file. Types $1 through $3 are standard
|
||||
(one-forked) files, type $5 is an extended
|
||||
(two-forked) file, and type $D is a
|
||||
subdirectory.
|
||||
file_sys_block_size
|
||||
Word For Disks: The block size used by the
|
||||
device should be placed in this field.
|
||||
For example, under ProDOS, this field will
|
||||
be 512, while for HFS it might be 524.
|
||||
The GS/OS Volume call will return this
|
||||
information if asked.
|
||||
+032 create_when Date/Time The date and time on which
|
||||
this record was initially created. If the
|
||||
creation date and time are available from
|
||||
a disk device, this information should be
|
||||
included. If the date is not known, or is
|
||||
unable to be calculated, this field should
|
||||
be set to zero. If the weekday is not
|
||||
known, or is unable to be calculated, this
|
||||
field should be set to zero.
|
||||
+040 mod_when Date/Time The date and time on which this record was
|
||||
last modified. If the modification date
|
||||
and time are available from a disk device,
|
||||
this information should be included. If
|
||||
the date is not known, or is unable to be
|
||||
calculated, this field should be set to
|
||||
zero. If the weekday is not known, or is
|
||||
unable to be calculated, this field should
|
||||
be set to zero.
|
||||
+048 archive_when Date/Time The date and time on which
|
||||
this record was placed in this archive.
|
||||
If the date is not known, or is unable to
|
||||
be calculated, this field should be set to
|
||||
zero. If the weekday is not known, or is
|
||||
unable to be calculated, this field should
|
||||
be set to zero.
|
||||
|
||||
The following option_list information is only present if the NuFX version
|
||||
number for this record is $0001 or greater.
|
||||
|
||||
+056 option_size Word The length of the FST-specific
|
||||
portion of a GS/OS option_list returned by
|
||||
GS/OS. This field may be $0000,
|
||||
indicating the absence of a valid
|
||||
option_list.
|
||||
|
||||
A GS/OS option_list is formatted as follows:
|
||||
|
||||
+000 buffer_size
|
||||
Word Size of the buffer for GS/OS to
|
||||
place the option_list in, including
|
||||
this count word. This must be at
|
||||
least $2E.
|
||||
+002 list_size
|
||||
Word The number of bytes of information
|
||||
returned by GS/OS.
|
||||
+004 file_sys_ID
|
||||
Word A file system ID word (see list
|
||||
above) identifying the FST owning
|
||||
the file in question.
|
||||
+006 option_bytes
|
||||
Bytes The bytes returned by the FST.
|
||||
There are (buffer_size - 6) of them.
|
||||
|
||||
The option_list contains information specific to native file systems that
|
||||
GS/OS doesn't normally use (such as true creator_type, file_type, and access
|
||||
privileges for AppleShare). Other FSTs released in the future will follow
|
||||
similar conventions to return native file system specific parameters in the
|
||||
option_list. Information in the option_list should always be copied from file
|
||||
to file.
|
||||
|
||||
The value option_size in the NuFX header is the value of list_size minus two.
|
||||
Immediately following the option_size count word are (list_size - 2) bytes.
|
||||
To pass these values back to the destination file system, construct an
|
||||
option_list with a suitably large buffer_size, a list_size of the NuFX
|
||||
option_size + 2, the file_sys_id of the source file, and the FST-returned
|
||||
option_bytes.
|
||||
|
||||
+058 list_bytes Bytes FST-specific bytes returned in an
|
||||
option_list. These are the bytes in the
|
||||
GS/OS option_list not including the FST ID
|
||||
word. There are option_size of them. If
|
||||
option_size is an odd number, one zero
|
||||
byte of padding is added to keep the block
|
||||
size an even number.
|
||||
|
||||
Because the attributes section does not have a fixed size, the next field must
|
||||
be found by looking two bytes before the offset indicated by attrib_count
|
||||
(+006).
|
||||
|
||||
+attrib_count - 2
|
||||
filename_length
|
||||
Word Obsolete, should be set to zero. In
|
||||
previous versions of NuFX, this field was
|
||||
the length of a file name or pathname
|
||||
immediately following this field.
|
||||
|
||||
To allow the inclusion of future
|
||||
additional parameters in the attributes
|
||||
section, NuFX utility programs should rely
|
||||
on the attribs_count field to find the
|
||||
filename_length field.
|
||||
|
||||
Current convention is to zero this field
|
||||
when building an archive and put the file
|
||||
or pathname into a filename thread so the
|
||||
record can be renamed in the archive.
|
||||
Archival programs should recognize both
|
||||
methods to find a valid file name or
|
||||
pathname.
|
||||
+attrib_count
|
||||
filename Bytes Filename or partial pathname if
|
||||
applicable. If this is a disk being
|
||||
archived, then the volume_name should be
|
||||
included in this field. If a volume name
|
||||
is included in this field, a separator
|
||||
should not be included in, or precede the
|
||||
name. If a volume name is not available,
|
||||
then this field should be zeros.
|
||||
|
||||
If a partial pathname is specified, the
|
||||
directories to which the current pathname
|
||||
refers need not have preceded this
|
||||
particular record. The extraction program
|
||||
must test each referenced directory
|
||||
individually. If the directory in
|
||||
question does not exist, the extracting
|
||||
program should create it.
|
||||
|
||||
Any utility which extracts file from a
|
||||
NuFX archive must not assume that this
|
||||
field will be in a format it is able to
|
||||
handle. In particular, extraction
|
||||
programs should check for syntax
|
||||
unacceptable to the operating system under
|
||||
which they run and perform whatever
|
||||
conversions are necessary to parse a legal
|
||||
filename or pathname. In general, assume
|
||||
nothing. (GS/OS programs should pass the
|
||||
filename or pathname directly to GS/OS,
|
||||
and only attempt to convert the name if
|
||||
GS/OS returns an "invalid pathname syntax"
|
||||
error.)
|
||||
|
||||
Both high and low ASCII values are valid
|
||||
but may not mean the same to each file
|
||||
system (for example, all eight bits are
|
||||
significant in AppleShare pathnames while
|
||||
only seven are significant in ProDOS
|
||||
pathnames).
|
||||
|
||||
|
||||
Threads
|
||||
|
||||
Thread Records are 16-byte records which immediately follow the Header Block
|
||||
(composed of the attributes and file name of the current record) and describe
|
||||
the types of data structures which are included with a given record. The
|
||||
number of Thread Records is described in the attribute section by a Word,
|
||||
total_threads.
|
||||
|
||||
Each Thread Record should be checked for the type of information that a given
|
||||
utility program can extract. If a utility is incapable of extracting a
|
||||
particular thread, that thread should be skipped (with the exception of
|
||||
extended files under ProDOS 8, which should be dearchived into AppleSingle
|
||||
format, or both threads should be skipped). If a utility finds a redundancy
|
||||
in a Thread Record, it must decide whether to skip the record or to do
|
||||
something with that particular thread (i.e., if a utility finds two
|
||||
message_thread threads it can either ignore the second one or display it.
|
||||
Likewise, if a utility finds two data_thread threads for the same file, it
|
||||
should inspect the thread_kind of each. If they match, it can either
|
||||
overwrite the first thread extracted, or warn the user and skip the second
|
||||
thread).
|
||||
|
||||
Thread records can be represented as follows:
|
||||
|
||||
+000 thread_class Word The classification of the thread:
|
||||
$0000 message_thread
|
||||
$0001 control_thread
|
||||
$0002 data_thread
|
||||
$0003 filename_thread
|
||||
+002 thread_format Word The format of the data within the thread:
|
||||
$0000 Uncompressed
|
||||
$0001 Huffman Squeeze
|
||||
$0002 Dynamic LZW/1 (ShrinkIt
|
||||
specific)
|
||||
$0003 Dynamic LZW/2 (ShrinkIt
|
||||
specific)
|
||||
$0004 Unix 12-bit Compress
|
||||
$0005 Unix 16-bit Compress
|
||||
+004 thread_kind Word Describes the kind of data within
|
||||
the thread.
|
||||
|
||||
thread_kind must be interpreted on the basis of thread_class. See the table
|
||||
below for the currently defined thread_kind interpretations:
|
||||
|
||||
class $0000 class $0001 class $0002 class $0003
|
||||
----------- ---------------- --------------------- -----------
|
||||
kind $0000 ASCII text create directory data fork of file filename
|
||||
kind $0001 see below undefined disk image undefined
|
||||
kind $0002 see below undefined resource fork of file undefined
|
||||
|
||||
+006 thread_crc Word For version_number $0003, this field
|
||||
is the CRC of the original data before it
|
||||
was compressed or otherwise transformed.
|
||||
The CRC-16's initial value is set to $FFFF.
|
||||
+008 thread_eof Long The length of the thread when uncompressed.
|
||||
+012 comp_thread_eof
|
||||
Long The length of the thread when compressed.
|
||||
|
||||
Class $0000 with kind $0000 is obsolete and should not be used.
|
||||
|
||||
Class $0000 with kind $0001 has a predefined comp_thread_eof and a thread_eof
|
||||
whose length may change. This way, a certain amount of space may be allocated
|
||||
when a record is created and edited later.
|
||||
|
||||
Class $0000 with kind $0002 is a standard Apple IIgs icon. comp_thread_eof is
|
||||
the length of the icon image; thread_eof is ignored.
|
||||
|
||||
Class $0003 with kind $0000 has a predefined comp_thread_eof and a thread_eof
|
||||
whose length may change. After this record is placed into the archive, the
|
||||
thread_eof can be changed if the name is changed, but the length of the name
|
||||
may not extend beyond the space allocated for it, comp_thread_eof.
|
||||
|
||||
A thread_format of $0001 indicates Huffman Squeeze. NuFX's Huffman is the
|
||||
same Huffman used by ARC v5.x, SQ and USQ, the source of which is publicly
|
||||
available and was originally written by Richard Greenlaw. The first word of
|
||||
the thread data is the number of nodes followed by the Huffman tree and the
|
||||
actual data. This is also the same algorithm decoded by the Apple II version
|
||||
of USQ written by Don Elton. The C source to this is widely available.
|
||||
|
||||
A thread_format of $0002 indicates a special variant of LZW (LZW/1) used by
|
||||
ShrinkIt. The first two bytes of this thread are a CRC-16 of the uncompressed
|
||||
data within the thread. This CRC-16 is initialized to zero ($0000). The third
|
||||
byte is the low-level volume number used by the eight-bit version of ShrinkIt
|
||||
to format 5.25" disks. The fourth byte is the run-length character used to
|
||||
decode the rest of the thread. The data which comprises the compressed file
|
||||
or disk immediately follows the RLE character.
|
||||
|
||||
When ShrinkIt compresses a file, it reads 4096-byte chunks of the file until
|
||||
it reaches the file's EOF. The last 4096-byte chunk is padded with zeroes if
|
||||
the file's length is not an exact multiple of 4096. Compressing a disk is
|
||||
also done by reading sequential blocks of 4096-bytes.
|
||||
|
||||
Each 4K chunk is first compressed with RLE compression. The RLE character is
|
||||
determined by reading the fourth byte of the thread. The RLE character which
|
||||
is used by most current versions of ShrinkIt is $DB. A run of characters is
|
||||
represented by three bytes, consisting of the run character, the number of
|
||||
characters in the run and the character in the run. If the 4K chunk expands
|
||||
after being compressed with RLE then the uncompressed 4K chunk is passed to
|
||||
the LZW compressor. If the 4K chunk shrinks after being compressed with RLE
|
||||
then the RLE-compressed image of the 4K chunk is passed to the LZW compressor.
|
||||
|
||||
ShrinkIt's LZW compressor individually compresses each 4K chunk passed to it
|
||||
by using variable length (9 to 12 bits) codes. The way that ShrinkIt's LZW
|
||||
compressor functions is almost identical to the algorithm used in the public
|
||||
domain utility Compress. The first code is $0101. The LZW string table is
|
||||
cleared before compressing each 4K chunk. If the compressed chunk increases
|
||||
in size, then the previous 4K chunk (which may be run-length-encoded or just
|
||||
uncompressed data) is written to the file.
|
||||
|
||||
The first word of every 4K chunk is aligned to a byte boundary within the file
|
||||
and is the length which resulted from the attempt at compressing the chunk
|
||||
with RLE. If the value of this word is 4096, then RLE was not successful at
|
||||
compressing the chunk. A single byte follows the word and indicates whether
|
||||
or not LZW was performed on this chunk. A value of zero indicates that LZW
|
||||
was not used, while a value of one indicates that LZW was used and that the
|
||||
chunk must first be decompressed with LZW before doing any further processing.
|
||||
|
||||
To decompress a file, each 4K chunk must first be expanded if it was
|
||||
compressed by LZW. If the 4K chunk wasn't compressed with LZW, then the word
|
||||
which appears at the beginning of each chunk must be used to determine if the
|
||||
data for the current chunk needs to be processed by the run-length decoder.
|
||||
If the value of the word is 4096, then run-length decoding does not need to
|
||||
occur because the data is uncompressed.
|
||||
|
||||
If the word indicates that the length of the chunk after being decompressed by
|
||||
LZW is 4096-bytes long, then no run-length decoding needs to take place. If
|
||||
value of the word is less than 4096 then the chunk must be run-length decoded
|
||||
to 4096 bytes.
|
||||
|
||||
There are four varying degrees of compression which can occur with a chunk: it
|
||||
can be uncompressed data. It can be run-length-encoded data without LZW
|
||||
compression. It can also be uncompressed data on which RLE was attempted (but
|
||||
failed) and then was subsequently compressed with LZW. Or, finally, the chunk
|
||||
can be compressed with RLE and then also compressed with LZW.
|
||||
|
||||
A thread_format of $0003 indicates a special variant of LZW (LZW/2) used by
|
||||
ShrinkIt. The first byte is the low-level volume number used by the eight-bit
|
||||
version of ShrinkIt to format 5.25" disks. The second byte is the run-length
|
||||
character used to decode the rest of the thread. The data which comprises the
|
||||
compressed file or disk immediately follows the second byte of the thread.
|
||||
|
||||
The format of LZW/2 is almost the same as LZW/1 with a few exceptions. Unlike
|
||||
LZW/1, where the LZW string table is automatically cleared before each 4K
|
||||
chunk is processed, the LZW string table used by LZW/2 is only cleared when
|
||||
the table becomes full, indicating a change in the redundancy of the source
|
||||
text. Not clearing the string table almost always yields improved compression
|
||||
ratios because the compressor's dictionary is not being depleted every 4K and
|
||||
larger strings are allowed to accumulate. The clear code used by ShrinkIt is
|
||||
$100. Whenever the decompressor sees a $100 code, it must clear the string
|
||||
table.
|
||||
|
||||
The string table is also cleared when the compressor has to "back track"
|
||||
because a 4K chunk became larger. Whenever a chunk that is not compressed by
|
||||
LZW is seen by the decompressor, the LZW string table must be cleared. Bits
|
||||
0-12 of the first word of each chunk in a LZW/2 thread indicate the size of
|
||||
the chunk after being compressed with RLE. The high bit (bit 15) indicates
|
||||
whether or not LZW was used on the chunk. If LZW was not used (bit 15 = 0),
|
||||
the data for the chunk immediately follows the first word. If LZW was used
|
||||
(bit 15 = 1), a second word which is a count of the total number of bytes used
|
||||
by the current chunk follows the first word. The mark of the next chunk can
|
||||
be found by taking the mark at the beginning of the current chunk and adding
|
||||
the second word to it, using that as an offset for a ProDOS 8 or GS/OS SetMark
|
||||
call. This is not normally necessary because the next chunk is processed
|
||||
immediately after the current chunk.
|
||||
|
||||
This second word is an improvement over LZW/1 because if a chunk becomes
|
||||
corrupted, but the second word is valid, the next chunk can be found and most
|
||||
of the file recovered. The second word is not needed (and not present) when
|
||||
LZW is not used on the chunk because the first word is also a count of the
|
||||
number of bytes which follow that word.
|
||||
|
||||
A thread_format of $0004 indicates that a maximum of 12 bits per LZW code by
|
||||
Compress was used to build this thread. The actual thread data contains
|
||||
Compress's usual three-byte signature, the third byte of which contains the
|
||||
actual number of bits per LZW code that was actually used. The number of bits
|
||||
may be less than or equal to 12. Optimally, this requires (at 12 bits) a 16K
|
||||
hash table to decode and should be used only for transferring to machines with
|
||||
limited amounts of memory. The C source to Compress is in the public domain
|
||||
and is widely available.
|
||||
|
||||
A thread_format of $0005 indicates that a maximum of 16 bits per LZW code by
|
||||
Compress was used to build this thread. The actual thread data contains
|
||||
Compress's usual three-byte signature, the third byte of which contains the
|
||||
actual number of bits per LZW code that was actually used. The number of bits
|
||||
may be less than or equal to 16. Optimally, this requires (at 16 bits) a 256K
|
||||
hash table to decode. The C source to Compress is in the public domain and is
|
||||
widely available.
|
||||
|
||||
If a control_thread indicates that a directory should be created on the
|
||||
destination device, the path to be created must take the form of a ProDOS
|
||||
partial pathname. That is, the path must not be preceded with a volume name.
|
||||
For example, /Stuff/SubDir is an invalid path for this control_thread, while
|
||||
SubDir/AnotherSubDir is valid.
|
||||
|
||||
If a control_thread indicates that a path is to be created, all subdirectories
|
||||
that are contained in the pathname must be created.
|
||||
|
||||
control_thread threads will eventually be used to control the execution of
|
||||
utility programs by allowing them to create, rename, and delete directories
|
||||
and files and to move and modify files. A form of scripting language will
|
||||
eventually be able to allow utility programs to perform these actions
|
||||
automatically. control_thread threads will allow extraction programs to
|
||||
perform operations similar to those of the Apple IIgs Installer, allowing
|
||||
updates to program sets dependent on such things as creation or modification
|
||||
dates and version numbers.
|
||||
|
||||
|
||||
Extra Information
|
||||
|
||||
If the file system of a particular disk is not known, the file_sys_id field
|
||||
should be set to zero, the volume name should also be zeroed, and all the
|
||||
other fields pertaining only to files should be set to zero.
|
||||
|
||||
If the file system of a particular disk is known, as many of the fields as
|
||||
possible should be filled with the correct information. Fields which do not
|
||||
pertain to an archived disk should remain set to zero.
|
||||
|
||||
If an entire disk is added to the archive without some form of compression
|
||||
(i.e., record_format = uncompressed), then the blocks which comprise the disk
|
||||
image must be added sequentially from the first through the last block. Since
|
||||
there will be no character included in the data stream to mark the end or
|
||||
beginning of a block, extraction programs should rely on the
|
||||
file_sys_block_size field to determine how many bytes to read from the record
|
||||
to properly fill a block.
|
||||
|
||||
Some Useful Thread Algorithms:
|
||||
|
||||
The beginning of the thread records can be found with the following algorithm:
|
||||
|
||||
Threads := (mark at beginning of header) + (attrib_count) +
|
||||
(filename_length)
|
||||
|
||||
The end of the thread records can be found with the following algorithm:
|
||||
|
||||
endOfThreads := Threads + (16 * total_threads)
|
||||
|
||||
The beginning of a data_thread can be found with the following formula:
|
||||
|
||||
Data Mark := endOfThreads + (comp_thread_eof of all threads in the thread
|
||||
list which are not data prior to finding a data_thread)
|
||||
|
||||
The beginning of a resource_thread may be found with the following algorithm:
|
||||
|
||||
Resource Mark := endOfThreads + (comp_thread_eof of all threads in the
|
||||
thread list which are not data prior to finding a
|
||||
resource_thread)
|
||||
|
||||
The next record can be found using the following algorithm:
|
||||
|
||||
Next Mark := endOfThreads + (comp_thread_eof of each thread)
|
||||
|
||||
The file name and its length can be found with the following algorithm:
|
||||
|
||||
if (filename_length > 0)
|
||||
then
|
||||
length of filename is filename_length;
|
||||
filename is found at attrib_count;
|
||||
else
|
||||
look through list of threads for a filename_thread;
|
||||
if you find one, then length of filename is thread_eof;
|
||||
if you don't find one, then you don't have a filename.
|
||||
|
||||
|
||||
Directories
|
||||
|
||||
Directories are handled almost the same way that normal files are handled with
|
||||
the exception that there will be no data in the thread which follows the
|
||||
entry. A Thread Record must exist to inform a utility that a directory is to
|
||||
be created through the use of the proper control_thread value.
|
||||
|
||||
Directories do not necessarily have to precede a record which references a
|
||||
directory. For example, if a record contains Stuff/MyStuff, the directory
|
||||
Stuff need not exist for the extracting program to properly extract the
|
||||
record. The extracting program must check to see if each of the directories
|
||||
referenced exist, and if one does not exist, create it. While this method
|
||||
places a great burden on the abilities of the extraction program, it avoids
|
||||
the anomalies associated with the deletion of directories within an archive.
|
||||
|
||||
|
||||
A Sample CRC Algorithm
|
||||
|
||||
Paper Bag Productions provides the source code to a very fast routine which
|
||||
does the CRC calculation as needed for NuFX archives. The routine makeLookup
|
||||
needs to be called only once. After the first call, the routine doByte should
|
||||
be called repeatedly with each new byte in succession to generate the
|
||||
cumulative CRC for the block. The CRC word should be reset to null ($0000)
|
||||
before beginning each new CRC.
|
||||
|
||||
This is the same CRC calculation which is done for CRC/Xmodem and Ymodem. The
|
||||
code is easily portable to a 16-bit environment like the Apple IIgs. The only
|
||||
detrimental factor with this routine is that it requires 512 bytes of main
|
||||
memory to operate. If you can spare the space, this is one of the fastest
|
||||
routines Paper Bag Productions knows to generate a CRC-16 on a 6502-type
|
||||
machine.
|
||||
|
||||
The CRC word should be reset to $0000 for normal CRC-16 and to $FFFF before
|
||||
generating the CRC on the unpacked data for each data thread.
|
||||
|
||||
|
||||
*-------------------------------
|
||||
* fast crc routine based on table lookups by
|
||||
* Andy Nicholas - 03/30/88 - 65C02 - easily portable to nmos 6502 also.
|
||||
* easily portable into orca/m format, just snip and save.
|
||||
* Modified for generic EDAsm type assemblers - MD 6/19/89
|
||||
|
||||
X6502 turn 65c02 opcodes on
|
||||
|
||||
*-------------------------------
|
||||
* routine to make the lookup tables
|
||||
*-------------------------------
|
||||
|
||||
makeLookup
|
||||
LDX #0 zero first page
|
||||
zeroLoop STZ crclo,x zero crc lo bytes
|
||||
STZ crchi,x zero crc hi bytes
|
||||
INX
|
||||
BNE zeroLoop
|
||||
|
||||
*-------------------------------
|
||||
* the following is the normal bitwise computation
|
||||
* tweeked a little to work in the table-maker
|
||||
|
||||
docrc
|
||||
LDX #0 number to do crc for
|
||||
|
||||
fetch TXA
|
||||
EOR crchi,x add byte into high
|
||||
STA crchi,x of crc
|
||||
|
||||
LDY #8 do 8 bits
|
||||
loop ASL crclo,x shift current crc-16 left
|
||||
ROL crchi,x
|
||||
BCC loop1
|
||||
|
||||
* if previous high bit wasn't set, then don't add crc
|
||||
* polynomial ($1021) into the cumulative crc. else add it.
|
||||
|
||||
LDA crchi,x add hi part of crc poly into
|
||||
EOR #$10 cumulative crc hi
|
||||
STA crchi,x
|
||||
|
||||
LDA crclo,x add lo part of crc poly into
|
||||
EOR #$21 cumulative crc lo
|
||||
STA crclo,x
|
||||
loop1 DEY do next bit
|
||||
BNE loop done? nope, loop
|
||||
|
||||
INX do next number in series (0-255)
|
||||
BNE fetch didn't roll over, so fetch more
|
||||
RTS done
|
||||
|
||||
crclo ds 256 space for low byte of crc table
|
||||
crchi ds 256 space for high bytes of crc table
|
||||
|
||||
|
||||
*-------------------------------
|
||||
* do a crc on 1 byte/fast
|
||||
* on initial entry, CRC should be initialized to 0000
|
||||
* on entry, A = byte to be included in CRC
|
||||
* on exit, CRC = new CRC
|
||||
*-------------------------------
|
||||
|
||||
doByte
|
||||
EOR crc+1 add byte into crc hi byte
|
||||
TAX to make offset into tables
|
||||
|
||||
LDA crc get previous lo byte back
|
||||
EOR crchi,x add it to the proper table entry
|
||||
STA crc+1 save it
|
||||
|
||||
LDA crclo,x get new lo byte
|
||||
STA crc save it back
|
||||
|
||||
RTS all done
|
||||
|
||||
crc dw 0000 cumulative crc for all data
|
||||
|
||||
The following CRC check is written in APW assembler format for an Apple IIgs
|
||||
with 16-bit memory and registers on entry.
|
||||
|
||||
crcByte start
|
||||
|
||||
crc equ $0
|
||||
crca equ $2
|
||||
crcx equ $4
|
||||
crctemp equ $6
|
||||
|
||||
sta crca 4
|
||||
stx crcx 4
|
||||
|
||||
eor crc+1 on entry, number to add to CRC 4
|
||||
and #$00ff is in (A) 3
|
||||
asl a 2
|
||||
tax 2
|
||||
lda crc16Table,x 5
|
||||
and #$00ff 3
|
||||
sta crcTemp 4
|
||||
|
||||
lda crc-1 4
|
||||
eor crc16Table,x 5
|
||||
and #$ff00 3
|
||||
ora crcTemp 4
|
||||
sta crc 4
|
||||
|
||||
lda crca 4
|
||||
ldx crcx 4
|
||||
rts cycles = 59
|
||||
|
||||
|
||||
;
|
||||
; CRC-16 Polynomial = $1021
|
||||
;
|
||||
crc16table anop
|
||||
dc i'$0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7'
|
||||
dc i'$8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef'
|
||||
dc i'$1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6'
|
||||
dc i'$9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de'
|
||||
dc i'$2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485'
|
||||
dc i'$a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d'
|
||||
dc i'$3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4'
|
||||
dc i'$b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc'
|
||||
dc i'$48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823'
|
||||
dc i'$c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b'
|
||||
dc i'$5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12'
|
||||
dc i'$dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a'
|
||||
dc i'$6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41'
|
||||
dc i'$edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49'
|
||||
dc i'$7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70'
|
||||
dc i'$ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78'
|
||||
dc i'$9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f'
|
||||
dc i'$1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067'
|
||||
dc i'$83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e'
|
||||
dc i'$02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256'
|
||||
dc i'$b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d'
|
||||
dc i'$34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405'
|
||||
dc i'$a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c'
|
||||
dc i'$26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634'
|
||||
dc i'$d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab'
|
||||
dc i'$5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3'
|
||||
dc i'$cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a'
|
||||
dc i'$4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92'
|
||||
dc i'$fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9'
|
||||
dc i'$7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1'
|
||||
dc i'$ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8'
|
||||
dc i'$6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0'
|
||||
end
|
||||
|
||||
Further Reference
|
||||
_____________________________________________________________________________
|
||||
o ProDOS 8 Technical Reference Manual
|
||||
o GS/OS Reference
|
||||
o Apple IIgs Toolbox Reference Manual
|
||||
o Apple II File Type Note, File Type $E0, Auxiliary Type $8000
|
||||
o Apple II Miscellaneous Technical Note #14, Guidelines for
|
||||
Telecommunication Programs
|
||||
o "A Technique for High-Performance Data Compression," T. Welch,
|
||||
IEEE Computer, Vol. 17, No.6, June 1984, pp. 8-19.
|
||||
</pre><hr>
|
||||
|
||||
<address>This document is Copyright by Apple Computer, Inc.</address>
|
||||
|
||||
<!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,353 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>Hacking Data Compression - Lesson 9</title>
|
||||
<meta name="Microsoft Border" content="t, default">
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000"><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td>
|
||||
|
||||
<p align="center"><font size="6"><strong></strong></font><br>
|
||||
</p>
|
||||
<hr>
|
||||
|
||||
</td></tr><!--msnavigation--></table><!--msnavigation--><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><!--msnavigation--><td valign="top">
|
||||
<h2>Hacking Data Compression - Lesson 9</h2>
|
||||
<p><a href="index.htm">Back to nulib.com library</a></p>
|
||||
<hr><pre>
|
||||
Hacking Data Compression Lesson 9 NuFX and ShrinkIt
|
||||
By Andy McFadden
|
||||
GEnie A2Pro Apple II University - Copyright (C) 1992 GEnie
|
||||
|
||||
|
||||
This week's lesson is about the de facto archiving standard for the
|
||||
Apple II world: NuFX, as implemented by ShrinkIt and GS/ShrinkIt.
|
||||
There are a variety of other programs, like ][+ ShrinkIt,
|
||||
Auto-Unshrink, NuLib, NuPak, and YankIt, but they all handle the same
|
||||
archive format.
|
||||
|
||||
The information covered here will be of interest to people who want to
|
||||
write software that works with NuFX archives. If you're only
|
||||
interested in general data compression, you can probably skip this
|
||||
one.
|
||||
|
||||
-=O=- ShrinkIt
|
||||
|
||||
Back in the Olden Days, the format for storage and transmission of
|
||||
data was Binary II (abbreviated "BNY", and occasionally referred to as
|
||||
"bunny" format). It arranged things on 128-byte boundaries for the
|
||||
convenience of terminal programs, and is still used today for that
|
||||
purpose. Actually, it was primarily meant as a way to retain the
|
||||
filetype, auxtype, and other goodies associated with a file, much like
|
||||
MacBinary for the Macintosh, but it also worked okay as an archive
|
||||
format.
|
||||
|
||||
What made it Really Cool was the Huffman + RLE compressor which was,
|
||||
well, almost built in to the Binary II Library Utility (BLU). It did
|
||||
a reasonable job of making things smaller, and in a modest amount of
|
||||
time. It was called SQueezed compression, which somehow got
|
||||
abbreviated ".QQ". Archives with squeezed files in them were ".BQY".
|
||||
|
||||
However, it was really depressing to log onto a UNIX system and watch
|
||||
UNIX compress crunch files into nothing. So, one fine day, a skinny
|
||||
little college student named Andy Nicholas, and a taller but still
|
||||
rather slim guy named Kent Dickey decided it would be a really neat
|
||||
thing to do LZW on the Apple II.
|
||||
|
||||
Since the IIgs and System 4.0 had been released, it was apparent that
|
||||
the old BNY format was missing a few pieces. Specifically, it had no
|
||||
clear provision for forked files, file comments, other file systems,
|
||||
and the expanded size of the stuff that GS/OS was returning in
|
||||
GetFileInfo calls. So, with some suggestions from a few dozen
|
||||
Apple II personalities, the NuFX format came into being.
|
||||
|
||||
(Sounds pretty dramatic, huh? Hmm, maybe I should write fiction...)
|
||||
|
||||
And so it came to pass that ShrinkIt was born. It took a little while
|
||||
to work all the kinks out, but before long it was recognized that the
|
||||
program worked faster and packed better than the old SQueezed format.
|
||||
When Binary II support was added, the fate of BLU and its ilk was
|
||||
sealed.
|
||||
|
||||
One interesting bit of history is that the LZW routines were initially
|
||||
meant for a program like DDD (Dalton's Disk Disintegrator), i.e. a
|
||||
*disk* packer which happened to pack files as well. This caused some
|
||||
interesting twists in the design.
|
||||
|
||||
-=O=- Details, Details
|
||||
|
||||
The first implementation of LZW was designed around packing a 5.25"
|
||||
disk using as little memory as possible. The strategy was to grab 4K
|
||||
chunks (the size of a single track on a 5.25" floppy), put it through
|
||||
an RLE pass (since tracks were often filled with zeros, this was very
|
||||
effective), and then an LZW pass. If the RLE or LZW pass failed, it
|
||||
would be omitted. If both failed, the block was stored without
|
||||
compression. A few bits at the start of each chunk in the compressed
|
||||
output held the information.
|
||||
|
||||
It turns out that putting a typical file through an RLE pass first
|
||||
doesn't really do you much good, though it isn't likely to do much
|
||||
harm. Mostly it just slows things down, unless the file is filled
|
||||
with a single character. In some cases it can make things slightly
|
||||
worse, because LZW is encoding the three-byte RLE codes instead of
|
||||
encoding long strings of zeros with a single 9 to 12-bit symbol. If
|
||||
more or all of a *disk* track is empty, RLE is a win, but it just
|
||||
doesn't happen all that often in text files.
|
||||
|
||||
The LZW encoder was reset after every 4K of *input*, which meant that
|
||||
it never had a chance to get completely full, and some of the 12-bit
|
||||
code space was wasted. However, this limited the maximum height of
|
||||
the tree considerably. For example, 4K of zeros can be compressed by
|
||||
a degenerate tree with 91 nodes in it. Since RLE would compress such
|
||||
a chunk, to get the worst case you have to alternate characters, so
|
||||
the worst you can get is around 64. This meant that the LZW stack
|
||||
required well under 100 bytes instead of 4096, and the loss in
|
||||
compression wasn't too unpleasant.
|
||||
|
||||
The other nice feature is that, since the LZW table can't get
|
||||
completely full, there's no need for explicit (or implicit) table
|
||||
clears. The whole thing just gets wiped on 4K boundaries.
|
||||
|
||||
To find the end of the data, the size of the output was stored.
|
||||
(Recall there are three ways of knowing when to stop: an explicit stop
|
||||
character, knowing the size of the input, and knowing the size of the
|
||||
output.) The LZW code given in lesson 8 used an explicit "end of
|
||||
file" code because I thought it was more interesting to do it that
|
||||
way, and because it works on a stream of data (you can't seek back and
|
||||
write the length bytes on a continuous stream... but since ShrinkIt
|
||||
knows the data will be < 4K, it can just stuff the bytes in before it
|
||||
writes to disk).
|
||||
|
||||
This scheme was eventually referred to as "LZW-I", and is still used
|
||||
by the ][+ and //e versions of ShrinkIt.
|
||||
|
||||
-=*=-
|
||||
|
||||
When writing GS/ShrinkIt, Andy Nicholas decided to hunker down and do
|
||||
LZW with table clears and all the fancy nonsense. However, he kept
|
||||
the 4K boundaries, which made things a bit confusing (and led to a bug
|
||||
which hung around in GSHK, NuLib, and YankIt until rather recently).
|
||||
|
||||
Basically, the input was still read in 4K chunks, and the RLE pass was
|
||||
still done. As before, the LZW pass was done on either the original
|
||||
4K or the RLE output, depending on whether or not RLE helped. The
|
||||
difference was that the table clears were no longer done after the end
|
||||
of the input. Instead, an explicit table clear code ($100) was sent
|
||||
whenever the table filled. To avoid having to make a copy of the
|
||||
table on every chunk, the table was also cleared whenever LZW failed
|
||||
to compress a piece of the file.
|
||||
|
||||
Of course, now the decoder stack had to be 4K, and all the fun with
|
||||
the table clears had to be added in. The long-lasting bug mentioned
|
||||
earlier occurred whenever a chunk ended after a table clear plus one
|
||||
character - if you look at the LZW decoder, you'll see that it grabs
|
||||
the first character, sets the prefix to that, and then plows onward.
|
||||
So the decoder was grabbing the first character, reaching the end of
|
||||
input, and then restarting with the next chunk by grabbing the first
|
||||
character again. This isn't an issue if you don't chop things into 4K
|
||||
pieces, which is why you don't see it mentioned in the class stuff.
|
||||
|
||||
So, LZW-II has all the advantages of an encoder which doesn't break
|
||||
the input into pieces, and retains its heritage as a disk compressor.
|
||||
One nice feature of the "chunking" is that it enables files with tough
|
||||
spots in them to be compressed better. Suppose you have a file with
|
||||
three pieces, call them A, B, and C. Let A and C be squishy text-like
|
||||
substance, while B is essentially random digitized sound. Even if we
|
||||
get 50% compression in A and C, B could expand by some amount (say,
|
||||
25%), reducing or even nullifying the compression of A and C. By
|
||||
storing the tough parts without compression, the only increase in B's
|
||||
size is the few bits of overhead needed to identify it as
|
||||
uncompressed.
|
||||
|
||||
This slightly anachronistic "chunking" behavior can help significantly
|
||||
for some kinds of files. By reducing the overhead to only a few bytes
|
||||
per 4K chunk, ShrinkIt will almost always do better than the simple
|
||||
LZW encoder given in class. The price is greater complexity in the
|
||||
compressor and decompressor, and a few bytes of overhead in the file.
|
||||
|
||||
If you want to see what effect the improvements had, compress some
|
||||
files with ShrinkIt and then compress them with GS/ShrinkIt. The
|
||||
difference tends to be small, which is counter to intuition, since LZW
|
||||
does poorly at the start.
|
||||
|
||||
-=*=-
|
||||
|
||||
This section explains the format of the LZW-I and LZW-II compressed
|
||||
threads. To find out what "threads" are, you'll need to consult the
|
||||
NuFX file type note.
|
||||
|
||||
LZW-I looks like this:
|
||||
|
||||
+0 (word) 16-bit CRC for the uncompressed data
|
||||
+2 (byte) disk volume # (remember, it started as a 5.25 disk packer)
|
||||
+3 (byte) RLE escape char, usually 0xdb
|
||||
|
||||
+4 a series compressed chunks, each built from 4K of input. Each
|
||||
chunk starts with the following:
|
||||
|
||||
++0 (word) size of data after RLE but before LZW (will be 4096
|
||||
if RLE wasn't used)
|
||||
++2 (byte) LZW flag - zero if LZW not used
|
||||
++3 compressed data
|
||||
|
||||
So something packed with only RLE would have a size != 4096 and an LZW
|
||||
flag of zero. LZW only would have a size == 4096 and LZW flag not
|
||||
equal to zero. RLE+LZW and storing without compression can be
|
||||
expressed by juggling things. The value at ++0 is used to decide when
|
||||
the LZW uncompressor should stop.
|
||||
|
||||
The CRC is computed on the uncompressed data. If the last piece of
|
||||
the file doesn't fill an entire 4K chunk, then the rest of the 4K
|
||||
chunk is filled with zeros. The ENTIRE chunk is compressed, zeros and
|
||||
all, and the CRC includes the extra zeros.
|
||||
|
||||
The actual LZW compression works like it did in class, with the
|
||||
modifications described earlier. Even though no explicit table clears
|
||||
are used, the codes begin at $101.
|
||||
|
||||
|
||||
LZW-II looks like this:
|
||||
|
||||
+0 (byte) disk volume #
|
||||
+1 (byte) RLE escape char, usually 0xdb
|
||||
|
||||
+2 a series compressed chunks, each built from 4K of input. Each
|
||||
chunk starts with the following:
|
||||
|
||||
++0 (word) size of data after RLE but before LZW (will be 4096
|
||||
if RLE wasn't used). The hi bit is used as the LZW flag,
|
||||
i.e. $8000 is ORed in if LZW is used.
|
||||
++2 (word) if and only if LZW is used, an extra length word is added
|
||||
here, which gives the total length of the compressed data after
|
||||
BOTH RLE and LZW.
|
||||
++2 or
|
||||
++4 compressed data
|
||||
|
||||
The reason for the extra length word is to provide a way to recover
|
||||
pieces of a file even if one of the chunks has been corrupted. With
|
||||
LZW-I, there's no way to identify the start of a chunk; with LZW-II,
|
||||
you can seek from the current chunk header to the next. The value
|
||||
isn't actually needed by the decompressor. If only RLE is used, then
|
||||
the size at ++0 will be accurate, so it's omitted from the output.
|
||||
|
||||
Notice that there's no CRC included in the header. This is because
|
||||
the CRC was moved to the thread header. It's computed with an initial
|
||||
seed of 0xffff (for historical reasons), and is computed on the
|
||||
original file. It does NOT include the zeros used to pad things to 4K
|
||||
boundaries.
|
||||
|
||||
-=O=- Knowne Implementations of NuFX Programmes
|
||||
|
||||
- ShrinkIt (a/k/a "P8 ShrinkIt"). Runs on enhanced //e, //c, IIgs.
|
||||
Requires 65c02. Packs with LZW-I, unpacks LZW-I and LZW-II.
|
||||
|
||||
- GS/ShrinkIt. Runs on IIgs only. Packs with LZW-II, unpacks LZW-I
|
||||
and II. Also handles several other file formats, including .Z (UNIX
|
||||
compress) and .ARC.
|
||||
|
||||
- ShrinkIt ][+ and UnShrinkIt ][+. Run on any Apple II, including
|
||||
Apple ][+. One packs, the other unpacks.
|
||||
|
||||
- Auto-Unshrink. Runs on any Apple II (?). Sort of a strange
|
||||
concept, but what the heck. Notable feature is a certain amount of
|
||||
error recovery for damaged archives (it knows about and will use the
|
||||
extra length word included for LZW-II).
|
||||
|
||||
- NuLib. Shell-based, runs on darn near anything. Packs with LZW-I,
|
||||
unpacks LZW-I, LZW-II, and UNIX compress (yes Virginia, you can have
|
||||
files packed with UNIX compress in a ShrinkIt archive... you just
|
||||
can't unpack them with anything else).
|
||||
|
||||
- NuPak. Started out like NuLib and GS/ShrinkIt slammed together at
|
||||
high speed, but never went anywhere. The $15 shareware fee and the
|
||||
release of GSHK probably did it in.
|
||||
|
||||
- YankIt. Shell-based, IIgs only. Unpacks LZW-I and II, does not
|
||||
pack at all. Faster (and smaller) than the others.
|
||||
|
||||
-=O=- PROGRAM
|
||||
|
||||
Being the author of both NuLib and YankIt, you'd figure I'd have some
|
||||
decent sample source code to give away. However, it shapes up like
|
||||
this:
|
||||
|
||||
- NuLib wasn't so much written as it was "evolved." It started out as
|
||||
an archive viewer, and expanded into a rather grotesque archiver. It
|
||||
looks okay on the outside, but the innards are a mess. Fortunately,
|
||||
it was written in C.
|
||||
|
||||
- YankIt is a cute little bare-bones archive viewer and extractor. It
|
||||
fit into about 6000 lines of assembly, and took under a month to
|
||||
design, implement, and test. My original intent was to release the
|
||||
complete source code with this lesson, but some bugs have been found
|
||||
and I haven't had the time to fix them, test it, etc, etc.
|
||||
|
||||
So, this means I'm going to flake and just point you at some useful
|
||||
stuff. I'll get the YankIt sources out eventually.
|
||||
|
||||
-=*=-
|
||||
|
||||
First of all, the definitive reference on the NuFX format is the
|
||||
filetype note for $e0/8002, which can be found in GEnie's A2Pro
|
||||
library. The not-quite-so-definitive-anymore reference is in the
|
||||
article AndyN wrote for the Winter 1990 Call-A.P.P.L.E. The article
|
||||
also contains a bit of history about NuFX and ShrinkIt.
|
||||
|
||||
The NuLib source code, which contains a bug in the stack declaration
|
||||
(only 100 bytes - correct for LZW-I, but not LZW-II, which should be
|
||||
4096), can be found in the A2Pro library on GEnie, and on the
|
||||
cco.caltech.edu anonymous FTP site.
|
||||
|
||||
NuLib executables for the IIgs and MS-DOS can also be found on GEnie,
|
||||
in the appropriate sections. Documentation for the MS-DOS version got
|
||||
renamed to "NULIB.SHK" or something equally meaningless. The file
|
||||
comment is also wrong; use "nulib xvt0 nulib.shk" to convert the line
|
||||
terminators from CR to CRLF. (It says to use "xvt2", which would
|
||||
convert CRLF to CRLF - a slightly silly thing to do.) NuLib has a
|
||||
whole pile of options, and would be a great program if the source code
|
||||
weren't so ugly.
|
||||
|
||||
(Hey, I started it a year after I started learning C, and well before
|
||||
I figured out how LZW worked... be charitable.)
|
||||
|
||||
The YankIt executable can be found in GEnie's A2 section. This
|
||||
contains the same stack bug found in NuLib, but it's smart enough to
|
||||
complain about the archive being corrupted and bail without scrubbing
|
||||
itself. It's got a nice "integrity check" feature which runs through
|
||||
and uncompresses every file, checking CRCs, but doesn't actually store
|
||||
them anywhere. NuLib acts like it has a similar feature, but it lies.
|
||||
GSHK should have a similar feature, but I caught AndyN too close to
|
||||
the shipping date of v1.1.
|
||||
|
||||
Since NuLib and YankIt are shell-based, and I didn't want to add the
|
||||
code to correctly handle disk archives, they extract disks as a single
|
||||
file. This can be useful for UNIX and MS-DOS Apple II emulators which
|
||||
require disk-files. Note that ShrinkIt uses ProDOS sector mapping, so
|
||||
the disks will work fine for the known UNIX emulators, but not for the
|
||||
MS-DOS emulator (which expects DOS 3.3 sector ordering). There are
|
||||
programs available which change the order around.
|
||||
|
||||
-=O=- DEEP THOUGHTS
|
||||
|
||||
- What are the advantages of writing an archiver which processes
|
||||
archive entries individually instead of reading them all at once?
|
||||
(hint: "yankit xv - < file.shk")
|
||||
|
||||
- Is 4096 the optimal size for stopping and checking compression
|
||||
progress?
|
||||
|
||||
- How does ShrinkIt's "checkpoint every 4K" compare to v.42bis? (see
|
||||
lesson 8 for details on v.42bis)
|
||||
|
||||
- Why does ShrinkIt clear the table after a chunk fails to compress
|
||||
with LZW? What would you have to do to avoid doing so?
|
||||
|
||||
-=!=-
|
||||
</pre><hr>
|
||||
<address>This document is Copyright by Genie and Andy McFadden</address>
|
||||
<!--msnavigation--></td></tr><!--msnavigation--></table></body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|23 Aug 2000 17:09:22 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/ftn.e08002.htm
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|31 Mar 2001 23:27:59 -0000
|
||||
vti_timelastmodified:TR|31 Mar 2001 23:50:31 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_filesize:IR|18223
|
||||
vti_title:SR|FTN.e00001
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
||||
vti_nexttolasttimemodified:TR|31 Mar 2001 23:29:42 -0000
|
||||
vti_cacheddtm:TX|31 Mar 2001 22:50:30 -0000
|
||||
vti_cachedlinkinfo:VX|H|index.htm
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/index.htm
|
||||
vti_cachedtitle:SR|FTN.e00001
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|31 Mar 2001 23:27:59 -0000
|
||||
vti_timelastmodified:TR|31 Mar 2001 23:50:40 -0000
|
||||
vti_filesize:IR|23942
|
||||
vti_title:SR|FTN.e000023
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
||||
vti_nexttolasttimemodified:TR|31 Mar 2001 23:32:29 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_cacheddtm:TX|31 Mar 2001 22:50:40 -0000
|
||||
vti_cachedlinkinfo:VX|H|index.htm
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/index.htm
|
||||
vti_cachedtitle:SR|FTN.e000023
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,23 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_timecreated:TR|31 Mar 2001 23:27:59 -0000
|
||||
vti_timelastmodified:TR|08 Oct 2002 02:13:58 -0000
|
||||
vti_filesize:IR|10628
|
||||
vti_title:SR|FTN.e00005
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.5526
|
||||
vti_backlinkinfo:VX|library/index.htm
|
||||
vti_nexttolasttimemodified:TR|31 Mar 2001 23:33:44 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_cacheddtm:TX|08 Oct 2002 02:13:58 -0000
|
||||
vti_cachedlinkinfo:VX|H|index.htm
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/index.htm
|
||||
vti_cachedtitle:SR|FTN.e00005
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|31 Mar 2001 23:27:59 -0000
|
||||
vti_timelastmodified:TR|31 Mar 2001 23:50:58 -0000
|
||||
vti_filesize:IR|28685
|
||||
vti_title:SR|FTN.e08000
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/old-binary2-spec.htm library/index.htm
|
||||
vti_nexttolasttimemodified:TR|31 Mar 2001 23:35:11 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_cacheddtm:TX|31 Mar 2001 22:50:58 -0000
|
||||
vti_cachedlinkinfo:VX|H|index.htm
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/index.htm
|
||||
vti_cachedtitle:SR|FTN.e08000
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,23 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_timecreated:TR|31 Mar 2001 23:27:59 -0000
|
||||
vti_timelastmodified:TR|05 May 2002 21:01:30 -0000
|
||||
vti_filesize:IR|53231
|
||||
vti_title:SR|FTN.e08002
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|library/old-nufx-spec.htm nufxlibapi.htm library/index.htm library/nufx-addendum.htm
|
||||
vti_nexttolasttimemodified:TR|31 Mar 2001 23:51:11 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_cacheddtm:TX|05 May 2002 21:01:30 -0000
|
||||
vti_cachedlinkinfo:VX|H|index.htm H|Crc16.c.txt
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/index.htm FHUS|library/Crc16.c.txt
|
||||
vti_cachedtitle:SR|FTN.e08002
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|31 Mar 2001 23:27:59 -0000
|
||||
vti_timelastmodified:TR|31 Mar 2001 23:42:04 -0000
|
||||
vti_filesize:IR|16806
|
||||
vti_title:SR|Hacking Data Compression - Lesson 9
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|library/index.htm
|
||||
vti_nexttolasttimemodified:TR|31 Mar 2001 23:40:39 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_cacheddtm:TX|31 Mar 2001 23:42:04 -0000
|
||||
vti_cachedlinkinfo:VX|H|index.htm
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/index.htm
|
||||
vti_cachedtitle:SR|Hacking Data Compression - Lesson 9
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|31 Jan 2000 05:35:38 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|Administrator
|
||||
vti_timecreated:TR|11 Jan 2000 07:01:48 -0000
|
||||
vti_timelastmodified:TR|08 Oct 2002 02:36:28 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_filesize:IR|3953
|
||||
vti_title:SR|NuLib Library
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Language en-us HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|library/ftn.e00005.htm library/old-nufx-spec.htm downloads/index.htm index.htm library/ftn.e00001.htm library/ftn.e08000.htm library/ftn.e08002.htm library/old-binary2-spec.htm library/ftn.e000023.htm library/lesson9.htm
|
||||
vti_nexttolasttimemodified:TR|31 Mar 2001 23:44:18 -0000
|
||||
vti_cacheddtm:TX|08 Oct 2002 03:36:30 -0000
|
||||
vti_cachedlinkinfo:VX|H|nufx-addendum.htm H|nulib2-preserve.htm H|FTN.e00001.htm H|FTN.e000023.htm H|FTN.e00005.htm H|FTN.e08000.htm H|FTN.e08002.htm H|Lesson9.htm K|http://www.fadden.com/dl-apple2/ H|old-nufx-spec.htm H|old-binary2-spec.htm H|../downloads/nulib325.tar.gz H|nulib324.tar.gz H|nulib324doc.txt H|nulib303.tar.gz H|nulib22.tar.gz H|nulib21.tar.gz H|nuview.tar.gz H|shrinkit.sdk H|gshk11.sea H|yanksrc.shk
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/nufx-addendum.htm FHUS|library/nulib2-preserve.htm FHUS|library/FTN.e00001.htm FHUS|library/FTN.e000023.htm FHUS|library/FTN.e00005.htm FHUS|library/FTN.e08000.htm FHUS|library/FTN.e08002.htm FHUS|library/Lesson9.htm NHHS|http://www.fadden.com/dl-apple2/ FHUS|library/old-nufx-spec.htm FHUS|library/old-binary2-spec.htm FHUS|downloads/nulib325.tar.gz FHUS|library/nulib324.tar.gz FHUS|library/nulib324doc.txt FHUS|library/nulib303.tar.gz FHUS|library/nulib22.tar.gz FHUS|library/nulib21.tar.gz FHUS|library/nuview.tar.gz FHUS|library/shrinkit.sdk FHUS|library/gshk11.sea FHUS|library/yanksrc.shk
|
||||
vti_cachedtitle:SR|NuLib Library
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,25 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|fadden
|
||||
vti_timecreated:TR|16 Jan 2000 01:49:15 -0000
|
||||
vti_timelastmodified:TR|26 Sep 2004 18:51:25 -0000
|
||||
vti_filesize:IR|34265
|
||||
vti_title:SR|NuFX Addendum
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Language en-us HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.7802
|
||||
vti_backlinkinfo:VX|nufxlibapi.htm library/index.htm
|
||||
vti_nexttolasttimemodified:TR|26 Sep 2004 18:47:01 -0000
|
||||
vti_structuredtm:TR|16 Jan 2000 19:37:14 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_cacheddtm:TX|26 Sep 2004 18:51:26 -0000
|
||||
vti_cachedlinkinfo:VX|H|FTN.e08002.htm H|http://www.zlib.org/ H|http://sources.redhat.com/bzip2/ H|http://www.fadden.com/ H|http://www.nulib.com/
|
||||
vti_cachedsvcrellinks:VX|FHUS|library/FTN.e08002.htm NHHS|http://www.zlib.org/ NHHS|http://sources.redhat.com/bzip2/ NHHS|http://www.fadden.com/ NHHS|http://www.nulib.com/
|
||||
vti_cachedtitle:SR|NuFX Addendum
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,24 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_author:SR|fadden
|
||||
vti_modifiedby:SR|Administrator
|
||||
vti_timecreated:TR|16 Jan 2000 19:37:01 -0000
|
||||
vti_timelastmodified:TR|09 Feb 2003 20:14:39 -0000
|
||||
vti_shadowfiles:VX|
|
||||
vti_filesize:IR|18445
|
||||
vti_title:SR|NuLib2's ProDOS Attribute Preservation
|
||||
vti_metatags:VR|HTTP-EQUIV=Content-Language en-us HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 GENERATOR Microsoft\\ FrontPage\\ 4.0 ProgId FrontPage.Editor.Document
|
||||
vti_progid:SR|FrontPage.Editor.Document
|
||||
vti_generator:SR|Microsoft FrontPage 4.0
|
||||
vti_extenderversion:SR|4.0.2.6513
|
||||
vti_backlinkinfo:VX|nulib2-manual.htm library/index.htm
|
||||
vti_nexttolasttimemodified:TR|09 Feb 2003 20:12:14 -0000
|
||||
vti_cacheddtm:TX|09 Feb 2003 20:14:40 -0000
|
||||
vti_cachedlinkinfo:VX|H|http://www.fadden.com/ H|http://www.nulib.com/
|
||||
vti_cachedsvcrellinks:VX|NHHS|http://www.fadden.com/ NHHS|http://www.nulib.com/
|
||||
vti_cachedtitle:SR|NuLib2's ProDOS Attribute Preservation
|
||||
vti_cachedbodystyle:SR|<body bgcolor="#FFFFFF" text="#000000">
|
||||
vti_cachedhasbots:BR|true
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|true
|
||||
vti_botnavbits:SW|SHUB
|
||||
vti_borderaggregate:SR|default
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|13 Jan 2000 07:49:18 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|13 Jan 2000 07:49:18 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|13 Jan 2000 07:49:18 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|31 May 1998 22:31:04 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
|
@ -0,0 +1,11 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|05 May 2002 21:07:10 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_cacheddtm:TX|13 Jan 2000 07:43:44 -0000
|
||||
vti_filesize:IR|37824
|
||||
vti_cachedlinkinfo:VX|
|
||||
vti_cachedsvcrellinks:VX|
|
||||
vti_cachedhasbots:BR|false
|
||||
vti_cachedhastheme:BR|false
|
||||
vti_cachedhasborder:BR|false
|
||||
vti_backlinkinfo:VX|library/index.htm
|
|
@ -0,0 +1,4 @@
|
|||
vti_encoding:SR|utf8-nl
|
||||
vti_timelastmodified:TR|13 Jan 2000 07:49:18 -0000
|
||||
vti_extenderversion:SR|4.0.2.2717
|
||||
vti_backlinkinfo:VX|library/index.htm
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue