注意:编译器只监视
*.asm
文件,并不是*.65s
文件
ZG Assembler
即可找到插件6502
65c816
(感谢Thirteen) z80-gb
,将来会加入更多适应平台。project-settings.json
文件,默认以下配置npm run build-core
,详情请查看 内核单独编译方法{
"platform": "6502", // 选择平台
"intellisense": true, // 是否开启智能提示
"outOfRangeWarning": true, // 编译结果越界警告
"entry": "main.asm", // 入口文件
"compileTimes": 2, // 编译次数,至少两次,否则会出错
"outputEntryFile": "", // 输出入口文件,不写则不输出
"outputSingleFile": "", // 单个文件输出,不写则不输出
"copyToClipboard": true, // 结果是否复制到剪贴板
"includes": ["**/*.asm"], // 项目包含的文件
"excludes": [] // 项目排除的文件
}
asm
文件下的编辑器内,点击鼠标右键则会出现编译菜单。通常情况下,编译器将自动优化寻址方式,以 6502
为例:
.ORG $0
LDA $00F0,X
由于编译器的自动优化,这里的编译结果是 B5 F0
,但是在某些情况下需要寻址长度为2,需要固定寻址长度,此时可以改成以下形式:
.ORG 0
LDA.2 $00F0,X ; 固定寻址长度为2字节
此时编译的结果为 BD F0 00
player.x
player.y
这样的子标签,并且智能提示能更好的协助你。xx = yy
是作为变量,编译器将不会检查重复定义的变量。如要定义常量,请使用 .DEF
命令。-- LDA $2002
BPL --
LDA $0
BEQ +
BPL ++
JMP $9000
+ JMP $8000
++ JMP $A000
; AD 02 20 10 FB A5 00 F0 05 10 06 4C 00 90 4C 00 80 4C 00 A0
注意:由于内核使用的是JS,所有运算符是以JS的运算符计算方法进行计算。例如: ~$A -> -11
+ - * / & | ~ ^
>> << && || !
== != >= <=
>
与 <
都有特殊的意义,例如 >$1234
即取高位 ($12), <$1234
取低位 ($34)*
有当不作为乘号时有特殊的意义,表示当前行的 ORG
地址$
作为单独符号出现(即不为16进制标识符),表示当前行的 BASE
地址有时候数据以字符串形式出现,例如 .DB "HELLO WORLD"
但是由于一些特殊限制,比如此字符串中的空格是十六进制 00
,可以通过简单的变换,结果如下:
.DB "HELLO\x00WORLD"
Unicode形式
.DB "HELLO\u{00}WORLD"
;
字符,该行 ;
之后所有内容都是注释;+
;-
则为折叠,方便折叠部分代码插件默认关闭基于字词的建议,想启用该功能,在vscode的设置内加入
{
"[zg-assembly]": {
"editor.wordBasedSuggestions": "matchingDocuments"
}
}
以下命令内中括号为可选参数
.BASE
.BASE 文件起始位置
.BASE 0
**,这里不等同与 .ORG
。.BASE $10
,则生成的文件编译内容从 $10
开始写入,之前的 $F
个地址为 0
。注意
- 编译自上而下,一些第一次编译需要赋值的变量如果第一次编译未知则编译不成功。
- 如果使用
.BASE
命令,则在.ORG
之后,否则编译错误。
.ORG
.ORG 编译起始位置
.ORG $8000
,则编译将从$8000开始。.ORG *
,表示从当前地址开始编译。不过要知道当前地址,否则编译器报错。.BASE
命令,则在 .ORG
之后,否则编译错误。.ENUM
.ENDE
.ENUM 起始地址
标签, 字节长度
...
.ENDE
.ENUM $300
music.counter, 1 ; 类似 .DEF music.counter, $300
music.addrHigh, 2 ; 类似 .DEF music.addrHigh, $301 (music.counter + 1)
music.addrLow, 3 ; 类似 .DEF music.addrLow, $303 (music.addrHigh + 2)
.ENDE
.DB
.DW
.DL
.DB 数据1 [, 数据2, 数据3...] ;1字节
.DW 数据1 [, 数据2, 数据3...] ;2字节
.DL 数据1 [, 数据2, 数据3...] ;4字节
.DBG
.DWG
.DLG
.ENDD
.DWG 标签
.data1, .data2, .data3, .data1
.ENDD
LDA data:.data1 ;0
LDA data:.data3 ;2
LDA data:.data1:1 ;3
.IF
.ELSEIF
.ELSE
.ENDIF
注意:必须要在使用这些之前知道参数的信息,否则编译报错
.IF a == 5
.....
.ELSEIF b >= 5
.....
.ELSEIF c != 3
.....
.ELSE
.....
.ENDIF
.IFDEF
.IFNDEF
.ELSE
.ENDIF
.IFDEF 标签或自定义函数
.....
.ELSE
.....
.ENDIF
.IF
的命令类似,后面可以用 .ELSE
.ENDIF
.IFDEF
为判断变量或自定义函数存在,.IFNDEF
为判断变量或自定义函数不存在。注:必须要在使用这些之前知道参数的信息,否则编译报错
.INCBIN
.INCBIN 文件相对路径[, 读取文件起始位置, 读取长度]
例如:
.INCBIN "文件夹\文件.bin", 0, 100
.INCLUDE
.INCLUDE 文件相对路径
例如:
.INCLUDE "文件夹\文件.asm"。
.MACRO
.ENDM
.MACRO 自定义函数名称[, 参数1, 参数2...]
.....
.ENDM
注意:用这里的指令可以自定义函数,所要使用的函数要在编译之前定义好,否则编译器会报错。
注意:所有自定义函数内的 标签 属于 局部变量,请勿在函数外部使用。
注意:所有自定义函数内定义的 变量 均为 全局变量。
实例1:
.MACRO TXY
TXA
TAY
.ENDM
TXY
8A A8
实例2:
.MACRO test, a, b
.IF 3 == a
LDA 3
.ELSEIF 4 == a
LDX 4
.ELSEIF 5 == a && 5 == b
LDY 5
.ELSE
LDA 6
STA 6
.ENDIF
.ENDM
test 3,3
test 4,3
test 5,4
test 5,5
A5 03 A6 04 A5 06 85 06 A4 05
.REPEAT
.ENDR
.REPEAT 重复次数
.....
.ENDR
.REPEAT
后输入表达式即可。注意:每个
.REPEAT
和.ENDR
必须成对出现,可以嵌套。
.REPEAT 2
NOP
.REPEAT 3
ASL
.ENDR
.ENDR
NOP ASL ASL ASL NOP ASL ASL ASL
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。