GameBoy引导ROM汇编代码及注释

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 

 

你可能感兴趣的:(GameBoy引导ROM汇编代码及注释)