我正在尝试学习如何在此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) 我打算在我的新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) 我正在努力学习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) 您在OSX上使用哪些工具进行C64的交叉开发?
哪个汇编程序,文本编辑器或IDE,gfx,sprite,charset编辑器?
或者你只是喜欢通过parallels desktop或bootcamp的Windows环境?
我想将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) 下面是我在 Commodore 64 上进行内存复制的自我修改例程。
我写了char codes
并number 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) 致力于一些 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 方向。我还可以使用哪些其他功能?
我得到?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)