几年前,我将一个NES游戏作为一个类项目实现,用6502程序集编写.我只在NES仿真器上运行它,但我希望它能在真正的硬件上运行.有没有开发板可以做到这一点?我理解它有点棘手,有mapper芯片等,但我愿意限制只是一个普通的映射器(比如说MMC3).
我正在寻找能够详细解决汇编编程原理的文本,而不是使用x86作为目标架构.我没有找到这样的近期书籍,但我希望在20世纪70年代和80年代写出一些好的书,当时整个申请仍然是用汇编写的.使用的架构也应该是更清洁的设计之一,例如6502或VAX.
我想要实现的第四字VALUE和TO(在仿真计算机一个RPC/8 的Minecraft MOD).只要我在编译时不使用它,我最好的尝试就会给我一组工作正常的单词.更具体的VALUE工作,但TO没有.
: VALUE CREATE , DOES> @ ;
: TO ' 3 + ! ;
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一切我能想到的工作,我的最佳尝试让我得到了这个:
['] NameOfAValue 3 + !
Run Code Online (Sandbox Code Playgroud)
需要注意的是该处理器是不是一个纯粹的6502,但一个65EL02的自定义变种65816.
编辑#1:不知怎的,我忘了调用CREATE的价值.应该一直都在那里.编辑#2:我也有3和+在TO调换了...哎呀.它本来应该是另一种方式.
我正在FPGA上构建Commodore PET.我已经在Kansas Lava中实现了我自己的6502内核(代码可以在https://github.com/gergoerdi/mos6502-kansas-lava获得),并在其周围放置足够的IO(https://github.com/gergoerdi/eightbit-kansas-lava)我能够启动原始的Commodore PET ROM,获得一个闪烁的光标并开始输入.
但是,在输入经典的BASIC程序之后
10 PRINT "HELLO WORLD"
20 GOTO 10
Run Code Online (Sandbox Code Playgroud)
它会在一段时间后(几秒钟后)崩溃
?ILLEGAL QUANTITY ERROR IN 10
Run Code Online (Sandbox Code Playgroud)
因为我的代码具有相当合理的每操作码测试覆盖率,并且它通过AllSuiteA,我想我会考虑更复杂行为的测试,这就是我如何到达Klaus Dormann的中断测试套件.在Kansas Lava模拟器中运行它已经指出了我原来的中断实现中的大量错误:
I进入中断处理程序时未设置该标志B标志是所有的地方I它们到达时未设置(正确的行为似乎是在I设置时排队中断以及何时取消设置,它们仍然应该被处理)修好这些之后,我现在可以成功运行Klaus Dormann测试,所以我希望将我的机器加载到真正的FPGA上,运气好的BASIC崩溃可能会消失.
然而,修复了所有这些中断错误并在模拟器中通过中断测试的新版本现在无法响应键盘输入,甚至只是在真实FPGA上闪烁光标.请注意,键盘输入和光标闪烁都是响应外部IRQ(从屏幕VBlank信号连接)完成的,所以这意味着固定版本以某种方式打破了所有中断处理 ...
我正在寻找任何可能出错的模糊建议或如何开始调试.
完整代码可在https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite获得,违规提交(修复测试并打破PET)是7a09b794af.我意识到这与最小可行再现完全相反,但变化本身很小,因为我不知道它出错的地方,并且因为重现问题需要一台功能足以引导库存Commodore PET ROM的机器,所以我不要我不知道怎么缩小它...
添加:
我设法在同一个硬件上用一个非常简单的(我敢说最小的)ROM而不是库存PET ROM重现相同的问题:
.org $C000
reset:
;; Initialize PIA
LDY #$07
STY $E813
LDA #30
STA $42
STA $8000
CLI
JMP *
irq:
CMP $E812 ; ACK …Run Code Online (Sandbox Code Playgroud) 我现在开始使用6502装配,并且在绕过需要处理大于8位的数字的循环时遇到问题.
具体来说,我想循环一些内存位置.在伪c代码中,我想这样做:
// Address is a pointer to memory
int* address = 0x44AD;
for(x = 0; x < 21; x++){
// Move pointer forward 40 bytes
address += 0x28;
// Set memory location to 0x01
&address = 0x01;
}
Run Code Online (Sandbox Code Playgroud)
所以从地址开始$44AD我想写入$01ram,然后向前跳$28,写入$01,然后再向前跳$28,直到我完成了20次(写的最后一个地址是$47A5).
我目前的方法是循环展开,编写起来很繁琐(尽管我认为汇编程序可以更简单):
ldy #$01
// Start from $44AD for the first row,
// then increase by $28 (40 dec) for the next 20
sty $44AD
sty $44D5
sty $44FD …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习如何在此Codebase64教程之后使用kernal例程来编写磁盘文件.
我复制了我的例程,用Acme Crossassembler编写,下面.它无法打开文件并显示错误消息:"FILE NOT OPENED"
; Definitions
SETNAM = $FFBD
SETFLS = $FFBA
OPEN = $FFC0
CHKOUT = $FFC9
READST = $FFB7
CLOSE = $FFC3
CLRCHN = $FFCC
CHROUT = $ffd2
;Basic Start
* = $0801 ; BASIC start address (#2049)
!byte $0d,$08,$dc,$07,$9e,$20,$34,$39 ; BASIC loader to start at $c000...
!byte $31,$35,$32,$00,$00,$00 ; puts BASIC line 2012 SYS 49152
;Program Code
* = $c000 ; Can be executed by writing sys 49152
ldx #<message0
ldy #>message0
jsr printMessage …Run Code Online (Sandbox Code Playgroud) 尝试使用JSR $ E09A在我的C64上生成一系列随机数,并从$ 63和$ 64中检索该数字.(根据我所看到的所有文档,当你使用BASIC的RND(0)时都是相同的例程.但不能让它迭代.下面的代码将工作并在$ 63和$ 64中放置一个不同的数字本身.
. C000 A5 00 LDA $00
. C002 20 9A E0 JSR $E09A
. C005 00 BRK
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试使用以下代码迭代10次时,它永远不会返回.
. C000 A0 0A LDY #$0A
. C002 A9 00 LDA #$00
. C004 20 9A E0 JSR $E09A
. C007 88 DEY
. C008 D0 F8 BNE $C002
. C00A 00 BRK
Run Code Online (Sandbox Code Playgroud)
我错过了一些我看不见的东西.我不担心它是多么"随机".此时我只想要一系列随机数.
我打算在我的新C64项目中使用多色字符模式的软件精灵.我的想法是使用叠加'bullet'精灵数据来平铺数据.
我想我可以在地址'TILESET'处获得tileset数据,在地址'SPRITE'处有精灵数据.我可以结合这两个来准备一个动态计算背景的子弹字符并存储在地址'SUPERIMPOSED'
我编写了以下代码和循环计数来检查它是否可行.而且我认为不是.循环吃了219个循环.近四条光栅线.并且我没有在此循环之前包含所需的其他必要计算.像计算目标地址一样.
当我想在屏幕上有16个子弹时,它将需要64个栅格或8个字符行.所以我变得怀疑.这是正确的方法吗?或者还有其他更优化的方法来完成同样的工作吗?
cycles
---------
ldy #$07 4 x1 = 4
- LDA TILESET,x 3 x8 = 24
AND SPRITE,x 4 x8 = 32
STA SUPERIMPOSED,x 5 x8 = 40
dey 2 x8 = 16
cpy 4 x8 = 32
bne - 3 x8-1 = 71
----------
219 Cycle
Run Code Online (Sandbox Code Playgroud)
我正在考虑在背景中重复模式.这样我就可以使用相同的子弹牌而无需重新计算.
我正在尝试使用Commodore 64中的内核例程来实现游戏控制.
下面的代码有一个例外.每个键击计为单个输入.例如:如果你一直按住按钮就没有效果.您必须释放并再次按下每个动作.我该如何改变这种行为?只要关键按下,我就想重新开始动作.
GETIN = $FFE4
SCNKEY = $FF9F
keyScan:
jsr SCNKEY ;get key
jsr GETIN ;put key in A
cmp #65
beq left
cmp #68
beq right
jmp keyScan
Run Code Online (Sandbox Code Playgroud) 我最近购买了一台 c64 mini,并尝试使用 Turbo Macro Pro v1.2 编写一些程序集。
在开发 hello world 程序时,我发现了一个使用自动运行 BASIC 标头的教程。
我还尝试添加 PRINT CHR$(147) 来清除屏幕,但出现内存不足错误。
原始的 BASIC 标头是:
*=$0801
.byte $0c, $08, $0a, $00, $9e, $20
.byte $34, $30, $39, $36, $00, $00
.byte $00
Run Code Online (Sandbox Code Playgroud)
我将其修改为:
*=$0801
.byte $0e, $08, $0a, $00, $99, $20
.byte $c7, $28, $31, $34, $37, $29
.byte $00,
.byte $19, $08, $14, $00, $9e, $20
.byte $34, $30, $39, $36, $00, $00
.byte $00
Run Code Online (Sandbox Code Playgroud)
当我从 TMP 组装并运行然后输入 LIST 时,我得到,
10 PRINT CHR$(147) …Run Code Online (Sandbox Code Playgroud)