X-Git-Url: http://git.joshuawise.com/fpgaboy.git/blobdiff_plain/b4f3ac35e69b7d5adf57959902abe2a104b42f4f..31b9962d02cae0e935e392b688370504fd4125ff:/bootrom.asm?ds=inline diff --git a/bootrom.asm b/bootrom.asm index 3cdf0e9..26ba6e4 100644 --- a/bootrom.asm +++ b/bootrom.asm @@ -1,175 +1,3 @@ - SECTION "a",HOME[$00] - - LD SP,$fffe ; $0000 Setup Stack - - XOR A ; $0003 Zero the memory from $8000-$9FFF (VRAM) - LD HL,$9fff ; $0004 -Addr_0007: - LD [HLD],A ; $0007 - BIT 7,H ; $0008 - JR NZ, Addr_0007 ; $000a - - LD HL,$ff26 ; $000c Setup Audio - LD C,$11 ; $000f - LD A,$80 ; $0011 - LD [HLD],A ; $0013 - LD [C],A ; $0014 - INC C ; $0015 - LD A,$f3 ; $0016 - LD [C],A ; $0018 - LD [HLD],A ; $0019 - LD A,$77 ; $001a - LD [HLD],A ; $001c - - LD A,$fc ; $001d Setup BG palette - LD [$FF47],A ; $001f - - LD DE,$0104 ; $0021 Convert and load logo data from cart into Video RAM - LD HL,$8010 ; $0024 -Addr_0027: - LD A,[DE] ; $0027 - CALL a95 ; $0028 - CALL a96 ; $002b - INC DE ; $002e - LD A,E ; $002f - CP $34 ; $0030 - JR NZ, Addr_0027 ; $0032 - - LD DE,Addr_00D8 ; $0034 Load 8 additional bytes into Video RAM - LD B,$08 ; $0037 -Addr_0039: - LD A,[DE] ; $0039 - INC DE ; $003a - LD [HLI],A ; $003b - INC HL ; $003c - DEC B ; $003d - JR NZ, Addr_0039 ; $003e - - LD A,$19 ; $0040 Setup background 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 [HLD],A ; $004d - DEC C ; $004e - JR NZ, Addr_004A ; $004f - LD L,$0f ; $0051 - JR Addr_0048 ; $0053 - - ; === Scroll logo on screen, and play logo sound=== - -Addr_0055: - LD H,A ; $0055 Initialize scroll count, H=0 - LD A,$64 ; $0056 - LD D,A ; $0058 set loop count, D=$64 - LD [$FF42],A ; $0059 Set vertical scroll register - LD A,$91 ; $005b - LD [$FF40],A ; $005d Turn on LCD, showing Background - INC B ; $005f Set B=1 -Addr_0060: - LD E,$02 ; $0060 -Addr_0062: - LD C,$0c ; $0062 -Addr_0064: - LD A,[$FF44] ; $0064 wait for screen frame - 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 increment scroll count - LD A,H ; $0073 - LD E,$83 ; $0074 - CP $62 ; $0076 $62 counts in, play sound #1 - JR Z, Addr_0080 ; $0078 - LD E,$c1 ; $007a - CP $64 ; $007c - JR NZ, Addr_0086 ; $007e $64 counts in, play sound #2 -Addr_0080: - LD A,E ; $0080 play sound - LD [C],A ; $0081 - INC C ; $0082 - LD A,$87 ; $0083 - LD [C],A ; $0085 -Addr_0086: - LD A,[$FF42] ; $0086 - SUB B ; $0088 - LD [$FF42],A ; $0089 scroll logo up if B=1 - DEC D ; $008b - JR NZ, Addr_0060 ; $008c - - DEC B ; $008e set B=0 first time - JR NZ, Addr_00E0 ; $008f ... next time, cause jump to "Nintendo Logo check" - - LD D,$20 ; $0091 use scrolling loop to pause - JR Addr_0060 ; $0093 - - ; ==== Graphic routine ==== - -a95: LD C,A ; $0095 "Double up" all the bits of the graphics data -a96: LD B,$04 ; $0096 and store in Video RAM -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 [HLI],A ; $00a3 - INC HL ; $00a4 - LD [HLI],A ; $00a5 - INC HL ; $00a6 - RET ; $00a7 - -NintendoLogo: - ;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: - ;More video data - DB $3C,$42,$B9,$A5,$B9,$A5,$42,$3C - - ; ===== Nintendo logo comparison routine ===== - -Addr_00E0: - LD HL,$0104 ; $00e0 ; point HL to Nintendo logo in cart - LD DE,NintendoLogo ; $00e3 ; point DE to Nintendo logo in DMG rom - -Addr_00E6: - LD A,[DE] ; $00e6 - INC DE ; $00e7 - CP [HL] ; $00e8 ;compare logo data in cart to DMG rom -.fuq JR NZ,.fuq ; $00e9 ;if not a match, lock up here - INC HL ; $00eb - LD A,L ; $00ec - CP $34 ; $00ed ;do this for $30 bytes - 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 -.fuq: JR NZ,.fuq ; $00fa ; if $19 + bytes from $0134-$014D don't add to $00 - ; ... lock up - - LD A,$01 ; $00fc - LD [$FF50],A ; $00fe ;turn off DMG rom - - SECTION "b",HOME[$100] boot: jr .running ; $0100 nop ; $0102 @@ -185,4 +13,12 @@ boot: jr .running ; $0100 .running: ld a, $FF ld [$FF51], A -.diq: jr .diq + ld a, $00 + ld [$FF25], a +.diq: ld A, [$FF51] + cp 0 + jr z, .diq + ld a, 0 + LD [$FF40],A + jp $0000 +