- 精华
- 0
- 帖子
- 1974
- 威望
- 0 点
- 积分
- 1995 点
- 种子
- 234 点
- 注册时间
- 2018-8-15
- 最后登录
- 2024-11-14
|
十二.大字体显示程序的思路:
一个大汉字占用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”又是什么意思呢?百思不得其解。 |
|