现代 6502 探索
内容 Home Updates Software Electronics Music Resume Contact YouTube BlueSky GitHub LinkedIn |
现代 6502
发布时间: 2016年3月27日 更新时间: 2016年4月16日
介绍
几年前,在寻找电子元件的时候,我偶然发现了 Western Design Center 的 W65C02 处理器。 即使它采用 DIP 封装,这使得像我这样的业余爱好者很容易在面包板上搭建电路,但它仍然需要 RAM 和其他芯片才能发挥作用。 考虑到这款芯片是我学习编程的第一款处理器,6502 对我来说更像是一种信仰,所以我买了两个。 我最终将其中一个安装在我家门口的门边,以寻求精神上的庇护。
几年后,在日常阅读 hackaday.com 时,我发现了 W65C265SXB 板,这是一个现代微控制器,其核心是 6502 (实际上是 65C816)。 我在一段时间内都非常努力地抵制购买它的想法,但最终还是屈服了。 为了充分利用这块板,我决定建立这个页面,展示 3 个小程序(最近添加了第 4 个),以展示使用这款新型 6502 芯片可以完成的一些事情:
- LED 闪烁 (汇编)
- 音乐播放 (Java)
- 软件 SPI DAC 声音播放器 (汇编)
- 更多音调发生器 (汇编)
除了本页上的 4 个项目之外,这块板还被用于在我的 磁带数据记录器 页面上录制和读取音频磁带中的数据,并在我的 PANCAKE-ROM 页面上读取瑞典煎饼上的巧克力数据。 网站上还有一个 W65C832 FPGA 项目,它是 6502 的 32 位版本。
开发板
实际上有 4 种 SXB 开发板可供选择。 我选择了基于 16 位 65C816 的开发板,因为它也可以在模拟模式下运行 8 位 6502 程序。 还有一个具有纯 6502 核心的版本。 这个开发板实际上相当强大…… 4 个 UART,大量的 IO,2 个音调发生器,以及一个 ROM 芯片,里面装满了使硬件通信更简单的例程。 任何想要玩本页程序的人都应该购买 W65C265SXB 开发板。
用于汇编/编译/上传这些程序的工具:
需要给 Joe 点个赞,感谢他为 naken_asm 和 Java Grinder 编写的 6502 / 65C816 模块,以及用于将软件上传到开发板的漂亮的 GUI。
mikekohn.net 上的相关项目 | 6502: | W65C265SXB Projects, C64 Java, Atari Java, Apple IIgs Java, Tape Data Recorder, PANCAKE-ROM, Apple IIe Robot
---|---
LED 闪烁
这是一条不成文的规则,即每个第一个微控制器项目都必须是一个 LED 闪烁程序。 这里以两种不同的方式编写了这个程序。 第一种方法是使用 65C816 指令,第二种方法是将芯片置于 65C02 模拟模式(使用指令“sec”和“xce”),并用 6502 汇编编写。 一件不要忘记的事情是在程序顶部使用“sei”指令来停止芯片的中断例程的运行。 如果不这样做,软件会做一些非常奇怪的事情。
要汇编这些程序,可以使用 naken_asm,然后使用 Joe's EasySXB GUI 将它们上传到开发板。 将 LED 闪烁程序的 hex 文件上传到 SXB 开发板后,只需将 0x1000(软件的 .org 起始地址)放在标记为“Address:”的文本框中,然后按 JML(jump long)按钮。 在尝试将任何新软件上传到开发板之前,只需记住按下开发板上的重置按钮。
源代码:led_blink_65c816.asm led_blink_65c02.asm
这是一个关于如何启动 EasySXB 并将 led_blink_65c816.hex LED 闪烁演示上传到开发板的视频。 https://youtu.be/E936wkrpAgs.
音乐播放器
W65C265 芯片内置了 2 个音调发生器,所以我决定用第二个项目来播放一些音乐。 与使用定时器切换 I/O 引脚不同,音调发生器会生成正弦波。 由于这个项目与之前的 SN76489 MIDI 播放器 项目非常相似,所以我最终使用了相同的 C 程序来播放 .mid 文件。 其思路是,PC 上的 C 程序解析 .mid 文件,并将 2 个字节发送到芯片,第一个字节告诉它要播放哪个通道和音量,第二个字节使用 MIDI 表示告诉它频率。
C .mid 播放器是为原始的 SN76489 MIDI 播放器 电路设计的,因此它真正想与具有 2 个声音芯片(每个芯片有 3 个声音)的电路通信。 在这种情况下,SXB 开发板显示为 2 个通道,每个通道只有一个声音。 因此,只有 2 个声音严重限制了听起来不错的 .mid 文件。 最终,巴赫的 Invenvention 13 听起来只有两个频道就不错,所以我在下面的视频中使用了它。 我本可以使用芯片上的额外计时器来获得更多带有方波的声音,但我不想创建额外的硬件来混合通道。
与用汇编编写的 LED 闪烁程序不同,我想展示 Java Grinder 对 65C816 的能力,因此该程序是用 Java 编写的。 我已经可以想象所有关于为 65C816 编写 Java 的奇怪评论,但它实际上非常巧妙。 甚至有一个用 Java Grinder 为 6502 编写的 Atari 2600 游戏 Space Revenge。
我发现最有趣的是声音的质量。 这些音调发生器用正弦波听起来真的很不错。 我仍然喜欢 SN76489 的声音(请参阅该页面上的视频和 mp3 进行比较),但 W65CSXB 真的悦耳(减去必须将那些吉他放大器调得太高才能用我的相机捕捉声音)。
这是一个播放巴赫的 Invention 13(又名 Commodore 64 主题曲)的软件的视频。 https://youtu.be/MCuxZxErThU.
软件 SPI
至少有两个著名的机器人运行在 6502 上:Futurama's Bender 和 The Terminator。 我想为其中一个机器人的某个部分编写一些 6502 代码可能会很有趣,所以我下载了 The Terminator 的声音样本,并将其与一些代码一起加载到该芯片上,以与 MCP4921 DAC 芯片通信。
我在这里编写了两个程序,一个具有非常通用的软件 SPI,另一个针对播放声音进行了优化。 我不确定是否有人会介意我使用 The Terminator 的声音样本,所以我将其从 git 存储库中删除了。 要汇编此项目,请下载 .wav 文件并运行以下命令:
sox ill_be_back.wav -b 16 -r 4000 out.wav ./convert_sound out.wav
convert_sound 程序包含在 EasySXB git 存储库中。 它将 .wav 文件中的 16 位声音样本转换为 12 位 DAC 格式(一个大端 16 位数字,其中高 4 位始终为 0x3,低 12 位为声音样本)。 在 play_sound.asm 源文件中,取消注释 .binfile 行并注释掉 .db 行。 输入 make。
要连接 MCP4921 SPI DAC 芯片,请连接:
-
- Vdd 至 +5v (P4x Pin 1)
-
- /CS 至 P40 (P4x Pin 3)
-
- SCK 至 P41 (P4x Pin 4)
-
- SDI 至 P42 (P4x Pin 5)
-
- /LDAC 至 GND (P4x Pin 2)
-
- VrefA 至 +5v (P4x Pin 1)
-
- AVss 至 GND (P4x Pin 2)
-
- VoutA 至 10uF 电容至放大器
源:software_spi.asm play_sound.asm
这是一个被编程为 The Terminator 一部分的 6502。 请注意,当我运行此程序时,我按 JSL 而不是 JML。 JML 跳转到该位置,而 JSL 作为子例程跳转到该位置。 当语音停止时,rts 指令应将控制权返回给 ROM。 https://youtu.be/di7iV8C51F4.
更多音调发生器
我拿了一个 SparkFun 寄给我的盒子,并在他们的网站上安装了4 个按钮。 我将电线焊接到按钮上,连接到面包板,并将 W65C265SXB 开发板的 Port 5 的 I/O 引脚连接到按钮。 每条输入线都通过一个 10k 电阻上拉,并在按下按钮时短路接地。
固件是用 65C816 汇编编写的,并被编程为和弦 F 大调、B 减、G 大调和 E 小调的前两个音符(二和弦)。 在弹吉他时可以用我的脚踩下按钮(没有我想象的那么容易)。
源代码:foot_pedal.asm
我通过音调发生器声音弹吉他的视频。 https://youtu.be/zBqONTSSqWk
版权所有 1997-2025 - Michael Kohn