rewrote main loop, cleaned up stuff, B button to step one frame

This commit is contained in:
2019-01-09 00:19:55 +01:00
parent 25d999968e
commit 3cd2f3d126
7 changed files with 175 additions and 194 deletions

View File

@@ -282,20 +282,11 @@ SwapBuffers:
; set old and rendered pointers to buffer1 ; set old and rendered pointers to buffer1
ld a, HIGH(Buffer1) ld a, HIGH(Buffer1)
ldh [Old], a ldh [Old], a
ldh [Rendered + 1], a
; set new pointer to buffer0 ; set new pointer to buffer0
ld a, HIGH(Buffer0) ld a, HIGH(Buffer0)
ldh [New], a ldh [New], a
; set video pointer to first tilemap
ld a, HIGH(_SCRN1)
ldh [Video + 1], a
; display bg 9800 that has just been filled
ld a, LCDCF_ON | LCDCF_BGON | LCDCF_BG9800
ld [rLCDC], a
jr InitAutomata.resetLow jr InitAutomata.resetLow
.newToBuffer1 .newToBuffer1
@@ -303,20 +294,11 @@ InitAutomata:
; set old and rendered pointers to buffer0 ; set old and rendered pointers to buffer0
ld a, HIGH(Buffer0) ld a, HIGH(Buffer0)
ldh [Old], a ldh [Old], a
ldh [Rendered + 1], a
; set new pointer to buffer1 ; set new pointer to buffer1
ld a, HIGH(Buffer1) ld a, HIGH(Buffer1)
ldh [New], a ldh [New], a
; set video pointer to second tilemap
ld a, HIGH(_SCRN0)
ldh [Video + 1], a
; display bg 9C00 that has just been filled
ld a, LCDCF_ON | LCDCF_BGON | LCDCF_BG9C00
ld [rLCDC], a
.resetLow .resetLow
; reset low bytes of pointers ; reset low bytes of pointers
xor a xor a

View File

@@ -24,102 +24,15 @@ InitEdit:
ldh [Down], a ldh [Down], a
ld a, REPEAT_START_DELAY ld a, REPEAT_START_DELAY
ldh [RepeatDelay], a ldh [RepeatDelay], a
ret
SECTION "Jingle", ROM0
Jingle:
; load initial frequency into HL
FREQUENCY = 330
ld hl, PULSE_FREQUENCY
; load step to be added to frequency in DE
; based on if a != 0 or not
or a
jr z, .up
.down
ld de, 100
jr .do
.up
ld de, -100
.do
; load note count
ld b, 3
.loop
; play pulse channel 1 with frequency set in HL
xor a
ldh [rNR10], a ; sweep
ld a, (%01 << 6) + 30
ldh [rNR11], a ; pattern + sound length
ld a, $43
ldh [rNR12], a ; init volume + envelope sweep
ld a, l
ldh [rNR13], a
ld a, h
or a, SOUND_START
ldh [rNR14], a
; add DE to HL frequency
add hl, de
; wait ~166ms
ld c, 6
.delay
HaltAndClearInterrupts
dec c
jr nz, .delay
; repeat a few times
dec b
ret z
jr .loop
EXPORT EditOldBuffer
SECTION "Edit old buffer", ROM0
EditOldBuffer:
; check start has been pressed
ldh a, [JoypadDown]
and a, PADF_START
ret z
; sound ON
ld a, $80
ldh [rNR52], a
ld a, $77
ldh [rNR50], a ; max volume on both speakers
ld a, $99
ldh [rNR51], a ; channels 1 (pulse) and 4 (noise) on both speakers
; play jingle with notes going down
xor a
call Jingle
; wait v-blank
halt
; show sprites
ldh a, [rLCDC]
or a, LCDCF_OBJON
ldh [rLCDC], a
; init sprite animation
xor a xor a
ldh [SpriteAnimation], a ldh [SpriteAnimation], a
ld a, SPRITE_ANIM_DELAY ld a, SPRITE_ANIM_DELAY
ldh [SpriteDelay], a ldh [SpriteDelay], a
ret
; set video address to displayed EXPORT EditOldBuffer
ldh a, [Video + 1] SECTION "Edit old buffer", ROM0
xor a, %100 EditOldBuffer:
ldh [Video + 1], a
; clear interrupts
xor a
ldh [rIF], a
.loop
; compute cursor X position ; compute cursor X position
ldh a, [SelectX] ldh a, [SelectX]
sla a sla a
@@ -152,22 +65,16 @@ EditOldBuffer:
; update sprite in OAM ; update sprite in OAM
SetSprite 0, b, c, d, 0 SetSprite 0, b, c, d, 0
call UpdateJoypad ; toggle targeted cell if A pressed
; check A button has been pressed
ldh a, [JoypadDown] ldh a, [JoypadDown]
and a, PADF_A and a, PADF_A
call nz, ToggleCell call nz, ToggleCell
; clear if SELECT pressed
ldh a, [JoypadDown] ldh a, [JoypadDown]
and a, PADF_SELECT and a, PADF_SELECT
call nz, Clear call nz, Clear
; check start has been pressed
ldh a, [JoypadDown]
and a, PADF_START
jr nz, .exit
; reset input ; reset input
xor a xor a
ldh [Down], a ldh [Down], a
@@ -251,38 +158,6 @@ EditOldBuffer:
ldh [SelectY], a ldh [SelectY], a
.endDown .endDown
; wait v-blank
.skip
HaltAndClearInterrupts
jp .loop
.exit
ld a, 1
call Jingle
; hide sprites
ldh a, [rLCDC]
and a, ~LCDCF_OBJON
ldh [rLCDC], a
; set video address to next displayed
ldh a, [Video + 1]
xor a, %100
ldh [Video + 1], a
; wait for sound to finish
ld b, 10
.waitSound
HaltAndClearInterrupts
dec b
jr nz, .waitSound
; sound OFF
xor a
ldh [rNR52], a
ret ret
SECTION "Value to flag", ROM0, ALIGN[8] SECTION "Value to flag", ROM0, ALIGN[8]
@@ -330,6 +205,7 @@ ToggleCell:
ldh a, [Video] ldh a, [Video]
ld l, a ld l, a
ldh a, [Video + 1] ldh a, [Video + 1]
xor a, %100
ld h, a ld h, a
MoveToCell 32 MoveToCell 32
@@ -352,10 +228,10 @@ ToggleCell:
; do sound based on new value ; do sound based on new value
and a, b and a, b
jr z, .blurp1 jr nz, .pulse
; do noisy sound ; do noisy sound
.blurp0 .noise
xor a xor a
ldh [rNR41], a ; sound length ldh [rNR41], a ; sound length
ld a, $F1 ld a, $F1
@@ -364,10 +240,10 @@ ToggleCell:
ldh [rNR43], a ; frequency ldh [rNR43], a ; frequency
ld a, $80 ld a, $80
ldh [rNR44], a ; start ldh [rNR44], a ; start
jr .exit ret
; do pulsy sound ; do pulsy sound
.blurp1 .pulse
xor a xor a
ldh [rNR10], a ; sweep ldh [rNR10], a ; sweep
ld a, (%01 << 6) + 30 ld a, (%01 << 6) + 30
@@ -379,8 +255,6 @@ FREQUENCY = 100
ldh [rNR13], a ldh [rNR13], a
ld a, SOUND_START | HIGH(PULSE_FREQUENCY) ld a, SOUND_START | HIGH(PULSE_FREQUENCY)
ldh [rNR14], a ldh [rNR14], a
.exit
ret ret
SECTION "Clear buffers", ROM0 SECTION "Clear buffers", ROM0
@@ -452,24 +326,4 @@ Clear:
or a, LCDCF_OBJON or a, LCDCF_OBJON
ldh [rLCDC], a ldh [rLCDC], a
; reset video pointer
ld hl, Video
ld a, [hl+]
ld h, [hl]
ld l, a
ld de, -(32 * 18)
add hl, de
ld a, l
ldh [Video], a
ld a, h
ldh [Video + 1], a
; reset rendered pointer
ldh a, [Progress]
ld l, a
ld [Rendered], a
ldh a, [Old]
ld h, a
ld [Rendered + 1], a
ret ret

View File

@@ -1,8 +1,14 @@
INCLUDE "hardware.inc" INCLUDE "hardware.inc"
INCLUDE "utils.inc" INCLUDE "utils.inc"
EMPTY_BG_TILE EQU 17
_VRAM_BG_TILES EQU $9000 _VRAM_BG_TILES EQU $9000
EMPTY_BG_TILE EQU 17
ANIMATE EQU %01
STEP EQU %10
SECTION "Main Memory", HRAM
Control: ds 1
SECTION "Header", ROM0[$100] SECTION "Header", ROM0[$100]
EntryPoint: EntryPoint:
@@ -12,11 +18,69 @@ REPT $150 - $104
db 0 db 0
ENDR ENDR
SECTION "Jingle", ROM0
Jingle:
; load initial frequency into HL
FREQUENCY = 330
ld hl, PULSE_FREQUENCY
; load step to be added to frequency in DE
; based on if a != 0 or not
or a
jr z, .up
.down
ld de, 100
jr .do
.up
ld de, -100
.do
; load note count
ld b, 3
.loop
; play pulse channel 1 with frequency set in HL
xor a
ldh [rNR10], a ; sweep
ld a, (%01 << 6) + 30
ldh [rNR11], a ; pattern + sound length
ld a, $43
ldh [rNR12], a ; init volume + envelope sweep
ld a, l
ldh [rNR13], a
ld a, h
or a, SOUND_START
ldh [rNR14], a
; add DE to HL frequency
add hl, de
; wait ~166ms
ld c, 6
.delay
HaltAndClearInterrupts
dec c
jr nz, .delay
; repeat a few times
dec b
ret z
jr .loop
SECTION "Main", ROM0[$150] SECTION "Main", ROM0[$150]
Start: Start:
; save gameboy type in B ; save gameboy type in B
ld b, a ld b, a
; enable sound
ld a, $80
ld [rNR52], a ; sound ON
ld a, $77
ldh [rNR50], a ; max volume on both speakers
ld a, $99
ldh [rNR51], a ; channels 1 (pulse) and 4 (noise) on both speakers
; enable v-blank interrupt ; enable v-blank interrupt
ld a, IEF_VBLANK ld a, IEF_VBLANK
ld [rIE], a ld [rIE], a
@@ -70,6 +134,10 @@ ENDC
ldh [rSCX], a ldh [rSCX], a
ldh [rSCY], a ldh [rSCY], a
; animate by default
ld a, ANIMATE
ldh [Control], a
; clear screen (both buffers) ; clear screen (both buffers)
ld hl, _SCRN0 ld hl, _SCRN0
ld d, EMPTY_BG_TILE ld d, EMPTY_BG_TILE
@@ -84,6 +152,7 @@ ENDC
call InitJoypad call InitJoypad
call InitAutomata call InitAutomata
call InitRender
call InitEdit call InitEdit
; enable h-blank interrupt in lcd stat ; enable h-blank interrupt in lcd stat
@@ -95,11 +164,68 @@ ENDC
ldh [rLCDC], a ldh [rLCDC], a
ClearAndEnableInterrupts ClearAndEnableInterrupts
.mainloop .mainloop
; animate if a control bit is set
ldh a, [Control]
or a
jr z, .interact
call StartRender call StartRender
call UpdateAutomata call UpdateAutomata
call WaitRender call WaitRender
call SwapBuffers call SwapBuffers
call UpdateJoypad
; clear step bit
ldh a, [Control]
and a, ~STEP
ldh [Control], a
jr .checkpause
.interact
HaltAndClearInterrupts
call EditOldBuffer call EditOldBuffer
jp .mainloop
; step if B is pressed
ldh a, [JoypadDown]
and a, PADF_B
jr z, .checkpause
; enable step bit in control
ld a, STEP
ldh [Control], a
; do sound
ld a, $6E
ldh [rNR10], a ; sweep
ld a, (%01 << 6) + 30
ldh [rNR11], a ; pattern + sound length
ld a, $62
ldh [rNR12], a ; init volume + envelope sweep
FREQUENCY = 220
ld a, LOW(PULSE_FREQUENCY)
ldh [rNR13], a
ld a, SOUND_START | HIGH(PULSE_FREQUENCY)
ldh [rNR14], a
.checkpause
call UpdateJoypad
ldh a, [JoypadDown]
and a, PADF_START
jr z, .mainloop
ldh a, [Control]
xor a, ANIMATE
ldh [Control], a
and a, ANIMATE
call Jingle
; toggle sprites
ldh a, [rLCDC]
xor a, LCDCF_OBJON
ldh [rLCDC], a
jr .mainloop

View File

@@ -18,14 +18,6 @@ ScrollNintendoOut:
dec b dec b
jr nz, .wait jr nz, .wait
; sound ON
ld a, $80
ldh [rNR52], a
ld a, $77
ldh [rNR50], a ; max volume on both speakers
ld a, $88
ldh [rNR51], a ; noise channel on both speakers
; make noise ; make noise
xor a xor a
ldh [rNR41], a ; set sound duration ldh [rNR41], a ; set sound duration
@@ -93,8 +85,4 @@ ScrollNintendoOut:
cp a, 88 cp a, 88
jp nz, .scrollup jp nz, .scrollup
; sound off
xor a
ldh [rNR52], a
ret ret

View File

@@ -115,9 +115,26 @@ LCDStatInterruptHandler:
; return from v-blank or lcd interrupt ; return from v-blank or lcd interrupt
reti reti
EXPORT InitRender
SECTION "Init render", ROM0
InitRender:
ld a, $9C
ldh [Video + 1], a
xor a
ldh [Video], a
ret
EXPORT StartRender EXPORT StartRender
SECTION "StartRender", ROM0 SECTION "StartRender", ROM0
StartRender: StartRender:
; set rendered pointer to old buffer
ldh a, [Progress]
ld l, a
ld [Rendered], a
ldh a, [Old]
ld h, a
ld [Rendered + 1], a
; start rendering ; start rendering
ld a, 20 ld a, 20
ldh [TilesLeft], a ldh [TilesLeft], a
@@ -152,4 +169,19 @@ IF RENDER_IN_HBL != 0
HaltAndClearInterrupts HaltAndClearInterrupts
ENDC ENDC
; swap video pointer
ldh a, [Video + 1]
dec a
dec a
xor a, %100
ldh [Video + 1], a
xor a
ldh [Video], a
; swap displayed BG
ldh a, [rLCDC]
xor a, LCDCF_BG9C00
or a, LCDCF_ON | LCDCF_BGON
ldh [rLCDC], a
ret ret

BIN
rom.gb

Binary file not shown.

View File

@@ -1,4 +1,3 @@
- skip nintendo intro on gbc/gba
- step by step on B button (rewrite main loop to remove second main loop in edit) - step by step on B button (rewrite main loop to remove second main loop in edit)
- music - music
- intro screen - intro screen