diff --git a/Makefile b/Makefile index 2143cad..4d2b2bb 100644 --- a/Makefile +++ b/Makefile @@ -21,13 +21,20 @@ dirs: # # Video # -video: videoDirs vblankInt.gb +video: videoDirs \ + ${BIN_DIR}/video/lcdToggle.gb \ + ${BIN_DIR}/video/vblankInt.gb videoDirs: ${MKDIR} -p ${BIN_DIR}/video ${MKDIR} -p ${OBJ_DIR}/video -vblankInt.gb: dirs +${BIN_DIR}/video/lcdToggle.gb: dirs video/lcdToggle.s + ${AS} -o ${OBJ_DIR}/video/lcdToggle.o video/lcdToggle.s + ${LD} -o ${BIN_DIR}/video/lcdToggle.gb ${OBJ_DIR}/video/lcdToggle.o + ${FIX} ${BIN_DIR}/video/lcdToggle.gb + +${BIN_DIR}/video/vblankInt.gb: dirs video/vblankInt.s ${AS} -o ${OBJ_DIR}/video/vblankInt.o video/vblankInt.s - ${LD} -l common.lnk -o ${BIN_DIR}/video/vblankInt.gb ${OBJ_DIR}/video/vblankInt.o + ${LD} -o ${BIN_DIR}/video/vblankInt.gb ${OBJ_DIR}/video/vblankInt.o ${FIX} ${BIN_DIR}/video/vblankInt.gb diff --git a/common.lnk b/common.lnk deleted file mode 100644 index 8e503a2..0000000 --- a/common.lnk +++ /dev/null @@ -1,51 +0,0 @@ -ROM0 - org $0000 - "rst00" - - org $0008 - "rst08" - - org $0010 - "rst10" - - org $0018 - "rst18" - - org $0020 - "rst20" - - org $0028 - "rst28" - - org $0030 - "rst30" - - org $0038 - "rst38" - - org $0040 - "intVblank" - - org $0048 - "intLcdc" - - org $0050 - "intTimer" - - org $0058 - "intSerial" - - org $0060 - "intJoypad" - - org $0068 - "preHeader" - - org $0100 - "headerJump" - - org $0104 - "header" - - org $0150 - "home" diff --git a/common/header.inc b/common/header.inc index c5f27a9..81342fb 100644 --- a/common/header.inc +++ b/common/header.inc @@ -1,87 +1,67 @@ ; 0000-003F : RST Handlers IF OverrideRst00 == 0 - SECTION "rst00", ROM0 + SECTION "rst00", ROM0[$0000] ret - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideRst08 == 0 - SECTION "rst08", ROM0 + SECTION "rst08", ROM0[$0008] ret - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideRst10 == 0 - SECTION "rst10", ROM0 + SECTION "rst10", ROM0[$0010] ret - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideRst18 == 0 - SECTION "rst18", ROM0 + SECTION "rst18", ROM0[$0018] ret - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideRst20 == 0 - SECTION "rst20", ROM0 + SECTION "rst20", ROM0[$0020] ret - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideRst28 == 0 - SECTION "rst28", ROM0 + SECTION "rst28", ROM0[$0028] ret - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideRst30 == 0 - SECTION "rst30", ROM0 + SECTION "rst30", ROM0[$0030] ret - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideRst38 == 0 - SECTION "rst38", ROM0 + SECTION "rst38", ROM0[$0038] ret - REPT 7 - nop - ENDR + DS 7 ENDC ; 0040-0067 : Interrupt Handlers IF OverrideIntVblank == 0 - SECTION "intVblank", ROM0 + SECTION "intVblank", ROM0[$0040] reti - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideIntLcdc == 0 - SECTION "intLcdc", ROM0 + SECTION "intLcdc", ROM0[$0048] reti - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideIntTimer == 0 - SECTION "intTimer", ROM0 + SECTION "intTimer", ROM0[$0050] reti REPT 7 nop @@ -89,40 +69,33 @@ IF OverrideIntTimer == 0 ENDC IF OverrideIntSerial == 0 - SECTION "intSerial", ROM0 + SECTION "intSerial", ROM0[$0058] reti - REPT 7 - nop - ENDR + DS 7 ENDC IF OverrideIntJoypad == 0 - SECTION "intJoypad", ROM0 + SECTION "intJoypad", ROM0[$0060] reti - REPT 7 - nop - ENDR + DS 7 ENDC ; 0068-00FF : Undefined -SECTION "preHeader", ROM0 - -; 0100-0103 : Jump Past Header -IF OverrideHeaderJump == 0 - SECTION "headerJump", ROM0 - nop - jp HeaderEnd -ENDC +SECTION "preHeader", ROM0[$0068] + DS $98 ; ---------------------- ; 0104-014F : ROM Header ; ---------------------- +SECTION "header", ROM0[$0100] + ; 0100-0103 : Jump Past Header + nop + jp ProgramStart -SECTION "header", ROM0 ; 0104-0133 : 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 + 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 ; 0134-013E : Title STATIC_ASSERT STRLEN(HeaderTitle) <= 13, "Header title is too large!" ; 11 characters + 2 quotes @@ -160,7 +133,7 @@ SECTION "header", ROM0 DB HeaderMaskRomVersion ; 014D : Header Checksum - DS 1 + DB $ff ; 014E-014F : Global Checksum - DS 2 + DW $ffff diff --git a/video/lcdToggle.s b/video/lcdToggle.s new file mode 100644 index 0000000..bbb0c11 --- /dev/null +++ b/video/lcdToggle.s @@ -0,0 +1,60 @@ +HeaderTitle EQUS "\"LCDTOGGLE\"" + +include "common/defines.inc" +include "common/header.inc" + +SECTION "home", ROM0 +vblankWait: + ; Wait for vblank without interrupts. + ldh a, [$ff44] + cp $90 + jr nz, vblankWait + ret + +wait: + call vblankWait + dec d + jr nz, wait + ret + +ProgramStart: + ld b, $00 + +reset: + ld hl, $8010 + ld a, b + xor $ff + ld b, a + +.loop: + ; Disable the LCD + call vblankWait + ldh a, [$ff40] + res 7, a + ldh [$ff40], a + + ; Mess with the logo, as we often do. + ld d, 16 + ld a, b +.logoDraw: + ld [hli], a + dec d + jr nz, .logoDraw + + ; Enable the LCD + ldh a, [$ff40] + set 7, a + ldh [$ff40], a + + ; Wait for a few frames. + ld d, 8 + call wait + + ; Check to see if we need to reset hl, then rinse and repeat. + ld a, h + cp $81 + jr nz, .loop + ld a, l + cp $90 + jr nz, .loop + jr reset diff --git a/video/vblankInt.s b/video/vblankInt.s index 7a1d783..455db2a 100644 --- a/video/vblankInt.s +++ b/video/vblankInt.s @@ -1,4 +1,4 @@ -HeaderTitle EQUS "\"BUILDTEST\"" +HeaderTitle EQUS "\"VBLANKINT\"" include "common/defines.inc" @@ -12,6 +12,7 @@ SECTION "intVblank", ROM0 reti SECTION "home", ROM0 +ProgramStart: ld a, %00011011 ld [$ff47], a @@ -21,12 +22,12 @@ SECTION "home", ROM0 ld a, 127 ld b, 0 -reset: +.reset: ld hl, $8010 ld d, 48 * 4 -loop: +.loop: halt dec d - jr z, reset - jr loop + jr z, .reset + jr .loop