A9VG电玩部落论坛

 找回密码
 注册
搜索
查看: 1633|回复: 4

看不懂“FC图文汉化教程”

[复制链接]

精华
0
帖子
1974
威望
0 点
积分
1995 点
种子
234 点
注册时间
2018-8-15
最后登录
2024-11-14
 楼主| 发表于 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”又是什么意思呢?百思不得其解。

精华
0
帖子
1974
威望
0 点
积分
1995 点
种子
234 点
注册时间
2018-8-15
最后登录
2024-11-14
 楼主| 发表于 2020-3-25 10:15  ·  四川 | 显示全部楼层
弄懂了两点:(一)JP = JMP

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

精华
0
帖子
1974
威望
0 点
积分
1995 点
种子
234 点
注册时间
2018-8-15
最后登录
2024-11-14
 楼主| 发表于 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就是字符串的首地址

精华
0
帖子
1974
威望
0 点
积分
1995 点
种子
234 点
注册时间
2018-8-15
最后登录
2024-11-14
 楼主| 发表于 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

精华
0
帖子
1974
威望
0 点
积分
1995 点
种子
234 点
注册时间
2018-8-15
最后登录
2024-11-14
 楼主| 发表于 2020-4-5 12:54  ·  四川 | 显示全部楼层
哦,这个“LDA text,x”原来是LDA $addr16,X(BD)绝对X变址 的意思,“text”就是.DB那些地址。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|A9VG电玩部落 川公网安备 51019002005286号

GMT+8, 2024-12-5 07:37 , Processed in 0.165896 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部