您的位置:首页 > 编程语言

GameBoy引导ROM汇编代码及注释

2011-01-30 01:11 330 查看
GameBoy电源打开后首先一段256字节的程序会被加载到内存的0的位置上并被运行,这段程序的左右有,检查卡带校验码,显示并滚动logo,播放提示音等等,下面是代码以及注释:

LD SP,$fffe		; $0000  设置栈指针
XOR A			; $0003  把$8000-$9FFF部分(显存)清零
LD HL,$9fff		; $0004
Addr_0007:
LD (HL-),A		; $0007
BIT 7,H		; $0008
JR NZ, Addr_0007	; $000a
LD HL,$ff26		; $000c  设置音频
LD C,$11		; $000f
LD A,$80		; $0011
LD (HL-),A		; $0013
LD ($FF00+C),A	; $0014
INC C			; $0015
LD A,$f3		; $0016
LD ($FF00+C),A	; $0018
LD (HL-),A		; $0019
LD A,$77		; $001a
LD (HL),A		; $001c
LD A,$fc		; $001d  设置背景调色板
LD ($FF00+$47),A	; $001f
LD DE,$0104		; $0021  把logo从卡带中转换并加载到显存里
LD HL,$8010		; $0024
Addr_0027:
LD A,(DE)		; $0027
CALL $0095		; $0028
CALL $0096		; $002b
INC DE		; $002e
LD A,E		; $002f
CP $34		; $0030
JR NZ, Addr_0027	; $0032
LD DE,$00d8		; $0034  加载附加的8字节到显存里
LD B,$08		; $0037
Addr_0039:
LD A,(DE)		; $0039
INC DE		; $003a
LD (HL+),A		; $003b
INC HL		; $003c
DEC B			; $003d
JR NZ, Addr_0039	; $003e
LD A,$19		; $0040  设置背景tilemap
LD ($9910),A	; $0042
LD HL,$992f		; $0045
Addr_0048:
LD C,$0c		; $0048
Addr_004A:
DEC A			; $004a
JR Z, Addr_0055	; $004b
LD (HL-),A		; $004d
DEC C			; $004e
JR NZ, Addr_004A	; $004f
LD L,$0f		; $0051
JR Addr_0048	; $0053
; === 在屏幕上滚动logo并播放一个logo音===
Addr_0055:
LD H,A		; $0055  加载滚动计数, H=0
LD A,$64		; $0056
LD D,A		; $0058  设置循环计数, D=$64
LD ($FF00+$42),A	; $0059  设置水平滚动寄存器
LD A,$91		; $005b
LD ($FF00+$40),A	; $005d  打开LCD,显示背景
INC B			; $005f
Addr_0060:
LD E,$02		; $0060
Addr_0062:
LD C,$0c		; $0062
Addr_0064:
LD A,($FF00+$44)	; $0064  等待屏幕桢
CP $90		; $0066
JR NZ, Addr_0064	; $0068
DEC C			; $006a
JR NZ, Addr_0064	; $006b
DEC E			; $006d
JR NZ, Addr_0062	; $006e
LD C,$13		; $0070
INC H			; $0072  自增滚动计数
LD A,H		; $0073
LD E,$83		; $0074
CP $62		; $0076  计数62次后,播放声音#1
JR Z, Addr_0080	; $0078
LD E,$c1		; $007a
CP $64		; $007c
JR NZ, Addr_0086	; $007e  计数64次后,播放声音#
Addr_0080:
LD A,E		; $0080  播放声音
LD ($FF00+C),A	; $0081
INC C			; $0082
LD A,$87		; $0083
LD ($FF00+C),A	; $0085
Addr_0086:
LD A,($FF00+$42)	; $0086
SUB B			; $0088
LD ($FF00+$42),A	; $0089  如果B=1那么向上滚动
DEC D			; $008b
JR NZ, Addr_0060	; $008c
DEC B			; $008e  自减B
JR NZ, Addr_00E0	; $008f    ... 跳转到 "Nintendo Logo 检查"
LD D,$20		; $0091  用滚动循环来暂停
JR Addr_0060	; $0093
; ==== 图像部分====
LD C,A		; $0095  转换图像数据并储存在显存里
LD B,$04		; $0096
Addr_0098:
PUSH BC		; $0098
RL C			; $0099
RLA			; $009b
POP BC		; $009c
RL C			; $009d
RLA			; $009f
DEC B			; $00a0
JR NZ, Addr_0098	; $00a1
LD (HL+),A		; $00a3
INC HL		; $00a4
LD (HL+),A		; $00a5
INC HL		; $00a6
RET			; $00a7
Addr_00A8:
;Nintendo Logo
.DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
.DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
.DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
Addr_00D8:
;附加的8字节数据
.DB $3C,$42,$B9,$A5,$B9,$A5,$42,$3C
; =====Nintendo logo 比较部分=====
Addr_00E0:
LD HL,$0104		; $00e0	; HL指向卡带上的Nintendo logo
LD DE,$00a8		; $00e3	; DE指向DMG rom里的Nintendo logo
Addr_00E6:
LD A,(DE)		; $00e6
INC DE		; $00e7
CP (HL)		; $00e8	;比较卡带上和DMG rom上的logo数据
JR NZ,$fe		; $00e9	;如果不匹配,那么锁死在这里
INC HL		; $00eb
LD A,L		; $00ec
CP $34		; $00ed	;共检查$30次
JR NZ, Addr_00E6	; $00ef
LD B,$19		; $00f1
LD A,B		; $00f3
Addr_00F4:
ADD (HL)		; $00f4
INC HL		; $00f5
DEC B			; $00f6
JR NZ, Addr_00F4	; $00f7
ADD (HL)		; $00f9
JR NZ,$fe		; $00fa	; 如果$19加上从$0134到$014D的所有字节的和不为0,那么锁死
LD A,$01		; $00fc
LD ($FF00+$50),A	; $00fe	;关闭DMG rom
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 c