NES 游戏模拟器
经典的 FC 红白机 游戏模拟器, 带我们回到小时候吧~~
警告,该模块只在标准固件(> 2m)中被编译包含,其他固件不带有,如有需求,请重新编译固件。
函数
init(rc_type=nes.KEYBOARD, cs, mosi, miso, clk, repeat=16, vol=5)
初始化 NES
模拟器
参数
tc_type
: 遥控器类型, 键盘(nes.KEYBOARD
)(注意是串口与电脑通信,而不是直接接USB键盘到开发板)或者手柄(nes.JOYSTICK
)。建议使用
PS2
手柄,体验会更好, 键盘通过串口工具输入可能不能同时按多个按键,当然也可以通过自己在PC写一个脚本来转发键值就能解决(去这里找找?)cs
: 如果使用SPI
接口的PS2
手柄, 传入cs
外设编号(注意不是引脚号,需要先映射引脚)mosi
: 如果使用SPI
接口的PS2
手柄, 传入mosi
外设编号(注意不是引脚号,需要先映射引脚)miso
: 如果使用SPI
接口的PS2
手柄, 传入miso
外设编号(注意不是引脚号,需要先映射引脚)clk
: 如果使用SPI
接口的PS2
手柄, 传入clk
外设编号(注意不是引脚号,需要先映射引脚)repeat
: 这个参数只对使用键盘(/串口)时, 指按键的重复率vol
: 初始化时的音量, 后面可以通过按键调整
基础示例
运行 NES
游戏 ROM
参数
nes
: 游戏ROM
路径, 比如/sd/mario.nes
try:
nes.init(nes.INPUT)
nes.load("/sd/mario.nes")
while True:
nes.loop()
finally:
nes.free()
快捷键
代码输入
nes.input
:(①号机手柄, ②号机手柄, 菜单功能)
键盘(/串口)
移动
:W A S D
A
:J
B
:K
start
:M
或者Enter
option
:N
或者\
退出
:ESC
音量 -
:-
音量 +
:=
运行速度 -
:R
运行速度 +
:F
手柄
移动
: 方向键<-
^
V
->
A
:□
B
:×
start
:START
select
:SELECT
退出
: 暂无音量 -
:R2
音量 +
:R1
运行速度 -
:L1
运行速度 +
:L2
例程
"mario.nes" 游戏文件请自行搜索下载
例 0: 代码输入
2021年01月28日:现在建议使用 Maix handle (I2C 设备)进行游玩,如下代码注释
nes.input(p1, p2, 0)
表示输入两个手柄的数据。
import nes, lcd
from machine import I2C
from fpioa_manager import fm
# 两个手柄分别通过 i2c 传输按键信息
i2c = I2C(I2C.I2C_SOFT, freq=60*1000, sda=27, scl=24, gscl=fm.fpioa.GPIOHS7,gsda=fm.fpioa.GPIOHS8)
i2c2 = I2C(I2C.I2C_SOFT, freq=60*1000, scl=23, sda=20, gscl=fm.fpioa.GPIOHS9,gsda=fm.fpioa.GPIOHS10) # software i2c
print(i2c.scan())
print(i2c2.scan())
lcd.init()
lcd.bgr_to_rgb(False)
# B A SEL START UP DOWN LEFT RIGHT
# 1 2 4 8 16 32 64 128
try:
nes.init(nes.INPUT)
nes.load("mario.nes")
for i in range(20000):
nes.loop()
for i in range(500):
nes.loop()
nes.input(8, 0, 0)
nes.loop()
nes.input(0, 0, 0)
while True:
p1 = i2c.readfrom(66, 1)
for i in range(10):
nes.loop()
nes.input(p1[0], 0, 0)
for i in range(10):
nes.loop()
finally:
nes.free()
例 1: 键盘(串口)
import nes, lcd
lcd.init(freq=15000000)
nes.init(nes.KEYBOARD)
nes.load("/sd/mario.nes")
while True:
nes.loop()
例 2: PS2 手柄
import nes, lcd
from fpioa_manager import fm
fm.register(19, fm.fpioa.GPIOHS19)
fm.register(18, fm.fpioa.GPIOHS18)
fm.register(23, fm.fpioa.GPIOHS23)
fm.register(21, fm.fpioa.GPIOHS21)
lcd.init(freq=15000000)
nes.init(nes.JOYSTICK, cs=fm.fpioa.GPIOHS19, clk=fm.fpioa.GPIOHS18, mosi=fm.fpioa.GPIOHS23, miso=fm.fpioa.GPIOHS21)
nes.load("/sd/mario.nes")
while True:
nes.loop()