“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
在模拟器中安装 A/UX 1.1:重现 90 年代苹果 UNIX 系统的完整指南
本文详细记录了在 Snow 模拟器上从原始软盘镜像安装 A/UX 1.1 的过程,包括硬件模拟、系统分区、内核启动、Bug 修复及技术细节。
引言
最近,我成功在自制的复古 Mac 模拟器 Snow 上让 A/UX 启动并稳定运行。A/UX 是苹果公司为其基于 68k 系列 Mac 打造的 UNIX 操作系统。它要求系统具备内存管理单元(MMU)以实现进程隔离——要么是原始 68020 版 Macintosh II 上的可选 68851 PMMU,要么是 68030 和 68040 机器中集成的 MMU。此外,它还需要浮点运算单元(FPU),因此只能在高端机器上运行,例如 Macintosh II 系列及后来的 Quadra,而 LC 系列则无缘于此。关于 A/UX 兼容性的更多信息,可参考 A/UX Penelope 这个不错的资源。你还可以在 Infinite Mac 上,通过 Snow 模拟的 Macintosh IIx 在浏览器中直接体验 A/UX 3.1.1。
最近,我有机会使用一套新归档的 A/UX 1.1 安装介质。这套介质来自 Dominic Sharp,我们一直在 Tinker Different 上交流。Dominic 获得了这套介质并希望将其公开归档,但不确定磁盘的状态。据我所知,此前没有任何 A/UX 1.1 软件被公开归档;最接近的是 1.1.1 的预装镜像,但当时在 Snow 上还无法运行。Dominic 同意将这套介质分享给我,以便我尝试安装并在此过程中修复 Snow 的问题。
这套介质包含 34 张软盘镜像,全部是 800K 的 GCR 格式。原始文件是原始磁通镜像(flux images),我首先使用 Applesauce 进行了转换。
硬件模拟的准备工作
首先,模拟器必须提供正确的硬件支持。Snow 已经模拟了所需的机器、CPU、FPU 和 PMMU,但之前只模拟了 Macintosh Display Card 8-24,我不确定 A/UX 1.x 是否支持这块显卡。A/UX 1.x 对视频硬件特别挑剔。根据 A/UX Penelope 的资料,Macintosh II 的原生显卡(代号“Toby”)是原生支持的,所以我首先在 Snow 中实现了这块显卡作为额外选项。
安装过程
A/UX 随附了非常 UNIX 风格的手册,因为操作系统和安装过程并不简单,这些手册必不可少。幸运的是,这些手册已经在 Bitsavers 上归档。
我带着数字版手册,开始了安装。
第一步:系统设置与 README 磁盘
安装从“System setup and README”磁盘开始。我们需要先对硬盘进行分区,然后做一个反直觉的操作:在 Mac 分区上安装 System 6。这是因为有一个 Mac 应用程序负责启动 A/UX 的引导过程:SASH(A/UX 独立 Shell)。这个“预引导环境”允许启动 A/UX 内核,并执行一些磁盘和恢复操作。
分区通过熟悉的 HD SC Setup 工具完成,过程相当直接;HD SC Setup 中包含了 A/UX 的模板布局。
第二步:安装 System 6 与 SASH
分区完成后,我们安装一个非常精简的 System 6,然后将“SASH and utilities”磁盘的内容复制到新安装中。
第三步:启动 A/UX 安装程序
现在,终于到了真正进入 A/UX 的时刻。通过从“Floppy Launch”磁盘启动来实现。这张磁盘会自动启动 SASH,接着启动 A/UX 内核,然后系统会提示插入“Floppy Root”磁盘。这开始了安装的第一部分,该部分会格式化 A/UX 分区并将一个引导系统复制进去。
遇到的 Bug 及修复
Bug 1:ADB 键盘修饰键卡死
在此过程中,我发现了一个 Snow 的 Bug:由于 ADB Talk 2 命令的实现不正确,导致修饰键(如 Command、Option 等)卡死。有趣的是,这个问题之前从未出现过,即使是 A/UX 3.x 也能正常运行。
问题的根源在于,ADB 键盘寄存器 2 的修饰键位是低电平有效的,而之前的实现错误地将其处理为高电平有效。修复后的代码片段如下:
diff
--- a/core/src/mac/adb/keyboard.rs
+++ b/core/src/mac/adb/keyboard.rs
@@ -140,29 +146,34 @@ impl AdbDevice for AdbKeyboard {
response
}
2 => AdbDeviceResponse::from_iter(
AdbKeyboardReg2::default()
// The key/modifier bits of register 2 are ACTIVE LOWAdbKeyboardReg2(0xFFFF)// LED state bits (0..2) are host-controlled and active-high .with_led_numlock(self.keystate[SC_NUMLOCK as usize]) .with_led_capslock(self.capslock) .with_led_scrolllock(self.keystate[SC_SCROLLOCK as usize])
.with_numlock(self.keystate[SC_NUMLOCK as usize]).with_capslock(self.capslock).with_scrolllock(self.keystate[SC_SCROLLOCK as usize]).with_cmd(self.keystate[SC_COMMAND as usize])
.with_numlock(!self.keystate[SC_NUMLOCK as usize]).with_capslock(!self.capslock).with_scrolllock(!self.keystate[SC_SCROLLOCK as usize]).with_cmd(!self.keystate[SC_COMMAND as usize]) .with_control(
self.keystate[SC_LCTRL as usize] || self.keystate[SC_RCTRL as usize],
!(self.keystate[SC_LCTRL as usize] || self.keystate[SC_RCTRL as usize]), ) .with_option(
self.keystate[SC_LOPTION as usize] || self.keystate[SC_ROPTION as usize],
!(self.keystate[SC_LOPTION as usize] || self.keystate[SC_ROPTION as usize]), )
.with_delete(self.keystate[SC_DELETE as usize])
.with_shift(!(self.keystate[SC_LSHIFT as usize] || self.keystate[SC_RSHIFT as usize]),).with_delete(!self.keystate[SC_DELETE as usize]) .to_be_bytes(), ), 3 => AdbDeviceResponse::from_iter( AdbReg3::default() .with_exceptional(true) .with_srq(true)
.with_address(Self::INITIAL_ADDRESS).with_handler_id(2) // Apple Extended Keyboard M0115
.with_address(self.address).with_handler_id(self.handler_id) .to_be_bytes(), ), _ => {
Bug 2:SCSI 控制器 DMA 结束位问题
修复第一个 Bug 后,我们重新从硬盘启动,运行 SASH 并真正进入 A/UX 安装的第二部分。在这里,我又遇到了另一个 Snow 的 Bug:内核启动时卡住,等待 NCR 5390 SCSI 控制器的“DMA end”位。同样,这个问题在之前从未出现,即使是更新的 A/UX 版本也没有问题。
问题的原因是,在非 DMA 模式下,dma_end 位不应该被置位。修复后的代码片段如下:
diff
--- a/core/src/mac/scsi/controller.rs
+++ b/core/src/mac/scsi/controller.rs
@@ -771,10 +771,13 @@ impl BusMember
NcrReadReg::BSR => Some(
self.reg_bsr
.with_dma_req(self.get_drq())
.with_dma_end(!matches!(self.busphase,ScsiBusPhase::DataIn | ScsiBusPhase::DataOut,))
.with_dma_end(self.reg_mr.dma_mode()&& !matches!(self.busphase,ScsiBusPhase::DataIn | ScsiBusPhase::DataOut,),) .with_phase_match(self.phase_match()) .0, ),
第四步:安装 26 张系统磁盘
第二部分安装需要依次插入整整 26 张“Installation disks”,其中包含实际的操作系统。可以想象,这过程相当耗时……如果你有磁带机,可以选择从磁带安装,从而省去所有换盘操作。Dominic 的收藏中也有这一历史设备。如果这份磁带镜像将来被归档,我肯定会为 Snow 添加一个模拟的 Apple 40SC 磁带机,以便进行磁带安装。
第五步:完成安装
在插完 26 张磁盘后,再次重启,最终就得到了一个完整的 A/UX 1.1 安装,由硬盘上的 SASH 引导启动。
庆祝与图形界面
为了庆祝,我玩了一些经典的 UNIX 游戏。我很高兴 Snow 能够顺利完成整个安装过程,并且 A/UX 1.x 现在也能流畅运行。
你可能会问,A/UX 1.x 是否有图形界面。A/UX 3.x 的图形界面相当华丽,甚至可以通过 mac32 模拟层运行 Mac 应用程序(我曾在 A/UX 3.x 上运行过《神秘岛》),还支持 X11 应用程序。结果发现,如果你通过 init 2 进入多用户模式,可以运行一些称为“Toolbox 应用程序”的图形程序(指的是 Macintosh ROM 中的 GUI Toolbox),但这样的程序只有三个。
致谢
再次感谢 Dominic 分享这些磁盘,这些镜像最终将被公开归档。