小编wiz*_*wor的帖子

在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
查看次数

在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中更改内核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
查看次数

CBM Program Studio汇编程序语法

我正在努力学习CBM Program Studio.但我不能让宏为我工作.在宏观上,代码还可以.但是当我添加宏部分时,它在第7行给出了"无匹配结束定义".

任何的想法?

        *=$c000 ; sys 49152

        ; set screen colors to black 
        lda #$00
        sta $d020
        sta $d021

defm    waitmacro ;akumulatörü hac?l?yor   
        TYA
mloop   DEY
        BNE mloop
        TAY     
        endm waitmacro

        ;color bars
        LDX #$FF
loop    LDY #$07
        STY $d020

        waitmacro

        INY
        STY $d020

        waitmacro

        DEX
        BNE loop
        RTS
Run Code Online (Sandbox Code Playgroud)

assembly c64 6502 6510

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

适用于Mac OS X的Commodore 64开发工具

您在OSX上使用哪些工具进行C64的交叉开发?

哪个汇编程序,文本编辑器或IDE,gfx,sprite,charset编辑器?

或者你只是喜欢通过parallels desktop或bootcamp的Windows环境?

macos c64

5
推荐指数
2
解决办法
5389
查看次数

如何在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
查看次数

自修改内存复制例程练习,6502 ASM

下面是我在 Commodore 64 上进行内存复制的自我修改例程。

我写了char codesnumber of repeats在一个表中,充满了screen_ram的这个套路。

我正在寻找优化建议。在这种情况下,我的优先事项是内存。

memCopy:    
  sourceAddress=*+1 ; mark self modifying addrres
fetchNewData:
  lda data_table    ; read char value into A
  ldx data_table+1  ; read repeat value into x
  inc sourceAddress     
  inc sourceAddress 

  cpx #00           ; if X=0 
  beq end           ; finish copying

  destination=*+1
- sta SCREEN_RAM
  inc destination
  dex
  bne -

  jmp fetchNewData

end:
  rts   

; data format:  <char>,<number of repeats>,[<char>,<number of repeats>,...],00,00

data_table: 
!by 01,03,02,02,......,00,00
Run Code Online (Sandbox Code Playgroud)

assembly 6502

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

精灵运动的正弦函数的替代方案

致力于一些 C64 介绍性想法。我使用下面的代码和正弦表根据预先生成的正弦表移动精灵。

子程序

        ldx counter
        cmx #100
        jmp +

        ldx #00
        stx counter

+       lda sprite_sinus,x

        inc counter

        rts
Run Code Online (Sandbox Code Playgroud)

窦表

sprite_sinus   
    !by 25,23,21,20,18,17,15,14,12,11,10,8,7,6,5,4
    !by 3,2,2,1,1,0,0,0,0,0,0,0,0,0,1,1
    !by 2,3,4,5,6,7,8,9,10,12,13,14,16,17,19,21
    !by 22,24,25,27,28,30,32,33,35,36,37,39,40,41,42,43
    !by 44,45,46,47,48,48,49,49,49,49,49,49,49,49,49,48
    !by 48,47,47,46,45,44,43,42,41,39,38,37,35,34,32,31
    !by 29,28,26,25
Run Code Online (Sandbox Code Playgroud)

但我需要一些不同的东西。在循环路径中移动精灵的 x 和 y 方向。我还可以使用哪些其他功能?

assembly c64 6502 6510

2
推荐指数
1
解决办法
1026
查看次数

在VICE仿真器中加载PRG文件后出现C64内存不足错误

我得到?OUT OF MEMORY ERROR当我试图让磁盘返回后汇编程序的目录列表.

我准备了一个简单的例行程序,只是为了理解发生了什么,例如:

*=$c000

 lda #$00
 sta $d020
 rts
Run Code Online (Sandbox Code Playgroud)

我的构建脚本是:

C:\...\acme0.95.6win\acme.exe --outfile build\ROUTFILE --format cbm RSOURCEFILE
C:\...\tools\WinVICE-2.4-x64\x64.exe build\ROUTFILE
Run Code Online (Sandbox Code Playgroud)

当我运行构建脚本时,模拟器会加载PRG文件.尝试运行它,但没有任何反应,因为我没有包括BASIC加载器.即使在那之后,如果我写入LOAD "$",8目录列表.我到了?OUT OF MEMORY ERROR.那么上面的场景有什么问题呢?


PRG文件的十六进制转储是:

00 c0 a9 00 8d 20 d0 60 
Run Code Online (Sandbox Code Playgroud)

assembly c64

1
推荐指数
2
解决办法
523
查看次数

标签 统计

assembly ×8

c64 ×8

6502 ×7

6510 ×3

kernel ×1

macos ×1