看不懂“FC图文汉化教程”
查看: 1762|回复: 4
看不懂“FC图文汉化教程”
[复制链接]
风吹草动1979
风吹草动1979
当前离线
骑士
骑士, 积分 1998, 距离下一级还需 1002 积分
精华0
帖子1977
威望0 点
积分1998 点
种子234 点
注册时间2018-8-15
最后登录2025-5-18
串个门
加好友
打招呼
发消息
电梯直达
1楼
楼主|
发表于 2020-3-23 17:51 · 四川
|
只看该作者
|倒序浏览
|阅读模式
十二.大字体显示程序的思路:
一个大汉字占用4个Tile,切开变成:左上角、右上角、左下角、右下角。
写VRAM的过程如下:
设置PPU地址,指定第一个汉字的左上角位置 -> 写入左上角图案 -> PPU地址自动加0x01 -> 写入右上角图案 -> PPU地址加0x1F,设置汉字的左下角位置 -> 写入左下角图案 -> PPU地址自动加0x01 -> 写入右下角图案 -> PPU地址减加0x1F,设置第二个汉字的左上角位置 -> 如此循环,直到写完该行文本。
关于文本数据区的解释:
22 0b | 70 78 7c 80 84 | fe
PPU地址 | 单 人 游 戏 A | 文本分隔符(FF为文本结束)
注意在绘制汉化菜单之前,要先擦除原来的菜单,完整代码如下:
;代码开始
.ORG $8000
;from c921
;保留现场:
PHA
TXA
PHA
TYA
PHA
;切换VROM:
LDA #$01
;切换#01的VROM
STA $8000
;擦除不需要的图案:
LDY #$02
LDX #$60
LDA #$22
STA $2006
LDA #$00
STA $2006
LDA #$24
jp8
STA $2007
DEX
BNE jp8
DEY
BNE jp8
;大字体显示程序:
LDY #$02
LDX #$00
jp7
LDA text,x
;读取要设置的PPU地址高位
STA $20
INX
LDA text,x
;读取要设置的PPU地址低位
STA $21
INX
jp3
LDA text,x
;读取文本编码
CMP #$ff
;判断,如果编码是0xFF,则完成大字体显示,跳出自写程序
BEQ jp5
CMP #$fe
;判断,如果编码是0xFE,则继续绘制下一行文本
BNE jp6
INX
JMP jp7
jp6
STA $22
INX
jp1
LDA $20
STA $2006
;设置当前PPU地址高位(用于写入数据)
LDA $21
STA $2006
;设置当前PPU地址低位(用于写入数据)
LDA $22
STA $2007
;写入汉字的左上角或左下角图案
INC $22
LDA $22
STA $2007
;写入汉字的右上角或右下角图案
INC $22
DEY
BEQ jp2
CLC
;以下几条指令的作用:写完汉字的右上角后,将PPU地址设置为该汉字的左下角
LDA $21
ADC #$20
STA $21
LDA $20
ADC #$00
STA $20
JMP jp1
jp2
LDY #$02
SEC
;以下几条指令的作用:写完汉字的右下角后,将PPU地址设置为下一个汉字的左上角
LDA $21
SBC #$1e
STA $21
LDA $20
SBC #$00
STA $20
JMP jp3
;回复现场并跳回原来的程序:
jp5
LDA #$00
STA $20
STA $21
STA $22
PLA
TAY
PLA
TAX
PLA
LDA $0511
JMP $c924
text
.DB $22,$0b,$70,$78,$7c,$80,$84,$fe,$22,$4b,$70,$78,$7c,$80,$88,$fe,$22,$8b,$74,$78,$7c,$80,$84,$fe,$22,$cb,$74,$78,$7c,$80,$88,$fe,$23,$03,$8c,$90,$94,$8c,$98,$9c,$a0,$fe,$23,$14,$a4,$a8,$ac,$b0,$fe,$20,$43,$b4,$fe,$20,$4f,$b8,$fe,$20,$5b,$bc,$fe,$23,$4a,$c0,$c4,$c8,$cc,$d0,$d4,$ff
;代码结束
其中“LDA text,x”里的text是什么意思呢?还有“.DB”又是什么意思呢?百思不得其解。
收藏1
回复
举报
风吹草动1979
风吹草动1979
当前离线
骑士
骑士, 积分 1998, 距离下一级还需 1002 积分
精华0
帖子1977
威望0 点
积分1998 点
种子234 点
注册时间2018-8-15
最后登录2025-5-18
串个门
加好友
打招呼
发消息
2楼
楼主|
发表于 2020-3-25 10:15 · 四川
|
只看该作者
弄懂了两点:(一)JP = JMP
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
回复
举报
风吹草动1979
风吹草动1979
当前离线
骑士
骑士, 积分 1998, 距离下一级还需 1002 积分
精华0
帖子1977
威望0 点
积分1998 点
种子234 点
注册时间2018-8-15
最后登录2025-5-18
串个门
加好友
打招呼
发消息
3楼
楼主|
发表于 2020-3-25 10:45 · 四川
|
只看该作者
(二)伪指令 .DB
该伪指令可以定义数据,比如字节,也可以定义 字符串,汉字等
1. 定义字节
在字节前加 $, 代表是十六进制
在字节前加 @, 代表是二进制
在字节前什么都不加,代表是十进制
例如
.ORG $0000
.DB $30,$31,$32
我们编译一下,选择 查看-内存窗口,发现地址0000开始的内容是 30 31 32
例如
.ORG $0000
.DB @00110000,@00110001,@00110010
我们编译一下,选择 查看-内存窗口,发现地址0000开始的内容是 30 31 32
例如
.ORG $0000
.DB 48,49,50
我们编译一下,选择 查看-内存窗口,发现地址0000开始的内容是 30 31 32
2. 定义字符串或汉字
例如
.ORG $0000
.DB "HELLO WORLD"
.DB "你好啊"
一般我们都在 .DB 前加一个标号,这样我们在程序中就可以用这些标号
例如,我们在屏幕上显示"HELLO WORLD"
.ORG $2000
LCD_BUFFER = $02C0
STR: .DB "HELLO WORLD",0
LDX #$0B
L1: LDA STR - 1, X
STA LCD_BUFFER - 1, X ;发送入到屏幕RAM
DEX
BNE L1
LDA #$01
STA $0402
.DB $00,$15,$8A ;由于编译器不支持INT 指令,所以这里直接定义INT $8A15机器码
.DB $00,$08,$C0 ;由于编译器不支持INT 指令,所以这里直接定义INT $C008机器码
RTS
这个程序中,STR就是字符串的首地址
回复
举报
风吹草动1979
风吹草动1979
当前离线
骑士
骑士, 积分 1998, 距离下一级还需 1002 积分
精华0
帖子1977
威望0 点
积分1998 点
种子234 点
注册时间2018-8-15
最后登录2025-5-18
串个门
加好友
打招呼
发消息
4楼
楼主|
发表于 2020-3-25 11:05 · 四川
|
只看该作者
LDA ($addr,X) 先变址X后间接寻址
两字节指令
指令格式:
操作码 第一字节
零页基地址 第二字节
这种寻址方式是先以X作为变址寄存器和零页基地址IND相加 IND+X,不过这个变址计算得到的只是一个间接地址,还必须
经过两次间接寻址才得到有效地址
第一次对 IND + X 间址得到有效地址低 8 位
第二次对 IND + X + 1 间址得到有效地址高 8 位
然后把两次的结果合起来,就得到有效地址.
我们看一个例子:
指令 LDA ($F0,X) 的寻址过程如下:
这里设 (X) = 02,(F2) = 30,(F3) = 40
那么先得到间接地址 = F0 + (X) = F0 + 02 = F2
第一次对地址F0 + (X) = F2间址得到有效地址低8位 = 30
第二次对地址F0 + (X) + 1 = F3间址得到有效地址高8位 = 40
那么有效地址就是地址4030了,该指令功能就是将地址4030的内容送入寄存器A
回复
举报
风吹草动1979
风吹草动1979
当前离线
骑士
骑士, 积分 1998, 距离下一级还需 1002 积分
精华0
帖子1977
威望0 点
积分1998 点
种子234 点
注册时间2018-8-15
最后登录2025-5-18
串个门
加好友
打招呼
发消息
5楼
楼主|
发表于 2020-4-5 12:54 · 四川
|
只看该作者
哦,这个“LDA text,x”原来是LDA $addr16,X(BD)绝对X变址 的意思,“text”就是.DB那些地址。
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
回复
举报