我使用ca65 汇编器和ld65 链接器在 6502 汇编器中为 Commodore 64 编写了一个短程序。该程序应该在靠近显示器中心的某处呈现一个实心方形精灵,但我没有看到任何正在呈现的东西。
这是我的程序集:
.segment "CODE"
; set sprite pointer index
; this, multiplied by $40, is the address
; in this case, the address is $2000
; $80 * $40 = $2000
lda #$80
sta $07f8
; enable sprite 0
lda #$01
sta $d015
; set x and y position
lda #$80
sta $d001
sta $d002
loop:
jmp loop
.segment "GFXDATA"
.byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
.byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
.byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
.byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF …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 BASIC中编写更大的函数.到目前为止,从我从其他来源(例如各种C64 wiki,以及C64本身的用户手册)看到的,函数定义只能是一行.也就是说,我似乎无法在BASIC中找到括号中的类似构造/其他语言用于描述代码块的其他内容.
有谁知道我如何在BASIC中编写多行代码块?
单行功能示例:
10 def fn X(n) = n + 1
20 print fn X(5) rem Correctly called function. This will output 6
Run Code Online (Sandbox Code Playgroud)
但我做不了类似的事情:
10 def fn X(n) =
20 n = n + 1
30 print n
40 rem I'd like the definition of function X to end at line 30 above
50 fn X(5) rem Produces syntax error on line 40
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) 我正在写一个小小的爱好c64文本冒险,我已经停在一个非常具体的时刻.也就是说,我不知道如何在引用内引用任何内容.
如何在商品64基本v.2.0中做到这一点.
我想将16位数除以2.我对这个问题的解决方案如下
lda $17 ;set high byte
ldx $32 ;set low byte
divide:
PHA ;push A to stack
TXA ;X > A
LSR ;divide low byte by 2
TAX ;A > X
PLA ;pull A from stack
LSR ;divide high byte by 2
BCC + ;C=0, skip
PHA ;while C=1
TXA ;add $80 to the lsb
ADC #$80
TAX
PLA
+
+printDecimal $0400+120
Run Code Online (Sandbox Code Playgroud)
所有PHA/PLA技巧都是因为我的printDecimal宏从A读取MSB,从X读取LSB.
当我在网上检查替代品时,我发现了4个指令替代我的简单划分例程.但我不明白.
div2:
LDA counter_hi ;Load the MSB
ASL ;Copy the sign bit into …Run Code Online (Sandbox Code Playgroud)