标签: c64

C64 程序集渲染精灵

我使用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)

assembly c64 6502 commodore ca65

8
推荐指数
1
解决办法
764
查看次数

我可以通过一些16位魔术把它变成一个循环吗?

我现在开始使用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)

assembly c64 6502

7
推荐指数
1
解决办法
1011
查看次数

在Commodore 64上使用程序集编写磁盘文件

我正在尝试学习如何在此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)

assembly c64 6502

7
推荐指数
1
解决办法
920
查看次数

从6502汇编程序获取随机数

尝试使用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)

我错过了一些我看不见的东西.我不担心它是多么"随机".此时我只想要一系列随机数.

random assembly c64 6502

7
推荐指数
2
解决办法
1603
查看次数

在Commodore 64上动态更新切片数据的更好方法

我打算在我的新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)

我正在考虑在背景中重复模式.这样我就可以使用相同的子弹牌而无需重新计算.

assembly c64 6502 6510

6
推荐指数
1
解决办法
267
查看次数

Commodore 64 BASIC中的多线功能

所以,我想在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)

感谢您的时间!

basic function c64 multiline commodore

6
推荐指数
1
解决办法
704
查看次数

如何在Commodore 64中更改内核SCNKEY例程行为

我正在尝试使用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)

assembly kernel c64 6502

6
推荐指数
1
解决办法
455
查看次数

修改了 C64 PRG BASIC 标头?

我最近购买了一台 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)

assembly basic c64 6502

6
推荐指数
1
解决办法
529
查看次数

如何在引号内打印引号但在commodore 64 basic v.2.0中

我正在写一个小小的爱好c64文本冒险,我已经停在一个非常具体的时刻.也就是说,我不知道如何在引用内引用任何内容.

如何在商品64基本v.2.0中做到这一点.

c64 commodore

5
推荐指数
1
解决办法
642
查看次数

如何在6502 asm中将16位数除以2?

我想将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)

assembly c64 6502

5
推荐指数
1
解决办法
1626
查看次数

标签 统计

c64 ×10

6502 ×8

assembly ×8

commodore ×3

basic ×2

6510 ×1

ca65 ×1

function ×1

kernel ×1

multiline ×1

random ×1