- Code:
Obj02_SubTitle_Text:
move.b $21(a0),mapping_frame(a0)
cmp.b #$80,$23(a0)
bcs.w Obj02_SubTitle_Text_Normal
move.b #$3B,mapping_frame(a0)
Obj02_SubTitle_Text_Normal:
move.w #$8010,art_tile(a0)
moveq #0,d6
move.b (Level_select_zone).w,d6
cmp.b $29(a0),d6
bne.s Obj02_SubTitle_Text_2
move.w #$E010,art_tile(a0)
Obj02_SubTitle_Text_2:
bsr.w Menu_Option_Obj_Load_Sub_Par
sub.w #$B,x_pos(a0)
add.w #$15,objoff_A(a0)
bra.w Obj02_Option_Icons_2
2 posters
cmp.w #$80,$23(a0)
No one- Mensagens : 910
Data de inscrição : 2015-06-23
- Post n°1
cmp.w #$80,$23(a0)
UburL33tUzerNam- Mensagens : 1142
Data de inscrição : 2013-08-08
Localização : Somewhere
Current Project : Things
- Post n°2
Re: cmp.w #$80,$23(a0)
thanskSomeone wrote:
- Code:
; ======================
; Jevil animation by DevEd
; ======================
; If set to 1, enable debugging features.
DebugMode = 1
; Defines
include "Defines.asm"
; =============
; Reset vectors
; =============
section "Reset $00",rom0[$00]
CallHL: jp hl
section "Reset $08",rom0[$08]
FillRAM:: jp _FillRAM
section "Reset $10",rom0[$10]
WaitVBlank:: jp _WaitVBlank
section "Reset $18",rom0[$18]
WaitTimer:: jp _WaitTimer
section "Reset $20",rom0[$20]
WaitLCDC:: jp _WaitLCDC
section "Reset $30",rom0[$30]
Panic: ret ; no longer used
section "Reset $38",rom0[$38]
GenericTrap::
jp GenericTrap ; only slightly more graceful than 39 00 but i need the extra ROM space so no crash handler
; ==================
; Interrupt handlers
; ==================
section "VBlank IRQ",rom0[$40]
IRQ_VBlank:: jp DoVBlank
section "STAT IRQ",rom0[$48]
IRQ_Stat:: jp DoStat
section "Timer IRQ",rom0[$50]
IRQ_Timer:: reti
section "Serial IRQ",rom0[$58]
IRQ_Serial:: reti
section "Joypad IRQ",rom0[$60]
IRQ_Joypad:: reti
; ===============
; System routines
; ===============
include "SystemRoutines.asm"
; ==========
; ROM header
; ==========
section "ROM header",rom0[$100]
EntryPoint::
nop
jp ProgramStart
NintendoLogo: ; DO NOT MODIFY OR ROM WILL NOT BOOT!!!
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
ROMTitle: romTitle "GB REVOLVING" ; ROM title (15 bytes)
GBCSupport: db $00 ; GBC support (0 = DMG only, $80 = DMG/GBC, $C0 = GBC only)
NewLicenseCode: db "DS" ; new license code (2 bytes)
SGBSupport: db 0 ; SGB support
CartType: db $19 ; Cart type, see hardware.inc for a list of values
ROMSize: ds 1 ; ROM size (handled by post-linking tool)
RAMSize: db 2 ; RAM size
DestCode: db 1 ; Destination code (0 = Japan, 1 = All others)
OldLicenseCode: db $33 ; Old license code (if $33, check new license code)
ROMVersion: db 0 ; ROM version
HeaderChecksum: ds 1 ; Header checksum (handled by post-linking tool)
ROMChecksum: ds 2 ; ROM checksum (2 bytes) (handled by post-linking tool)
ProgramStart::
di
ld sp,$e000
push bc
push af
; disable LCD
.wait
ldh a,[rLY]
cp $90
jr nz,.wait
xor a
ldh [rLCDC],a
; init memory
ld hl,$c000 ; start of WRAM
ld bc,$1ffa ; don't clear stack
xor a
rst $08
ld hl,$8000 ; start of VRAM
ld bc,$2000
xor a
rst $08
; clear HRAM
ld bc,$7f80
xor a
.loop
ld [c],a
inc c
dec b
jr nz,.loop
call CopyDMARoutine
call $ff80 ; clear OAM
; check GB type
; sets sys_GBType to 0 if DMG/SGB/GBP/GBL/SGB2, 1 if GBC, 2 if GBA/GBA SP/GB Jevil
; TODO: Improve checks to allow for GBP/SGB/SGB2 to be detected separately
pop af
pop bc
cp $11
jr nz,.dmg
.gbc
and 1 ; a = 1
add b ; b = 1 if on GBA
ld [sys_GBType],a
jr .continue
.dmg
xor a
ld [sys_GBType],a
.continue
InitScreen:
rst $10 ; wait for VBlank
xor a
ldh [rLCDC],a
; init rendering parameters
SetDMGPal rBGP, 0,1,2,3
SetDMGPal rOBP0,0,0,2,3
SetDMGPal rOBP1,0,1,2,3
xor a
ldh [rSCX],a
ldh [rSCY],a
; apparently WX=0 means WX=SCX
inc a
ldh [rWX],a
ld a,144-16
ldh [rWY],a
ld a,IEF_VBLANK
ldh [rIE],a
ld a,7
ld [rROMB0],a
Copy1BPPLightGray SuitsTiles,$1000,14
Copy1BPP ICanDoAnythingTiles,$1100,20
CopyTileset JevilTiles,0,(JevilTilesEnd-JevilTiles)/16
ld hl,SuitsTilemap
call DevPack_Decode
ld hl,ICanDoAnythingMap
ld de,$9c00
ld b,ICanDoAnythingMapEnd-ICanDoAnythingMap
call _CopyRAMSmall
; copy jevil frame data to RAM
ld a,8
ld [rROMB0],a
ld hl,JevilFrames
ld de,$d000
ld bc,$800
call _CopyRAM
ld a,$40
ld [JevilX],a
ld a,$38
ld [JevilY],a
ld a,6
ld [JevilAnimTimer],a
xor a
ld [JevilFrame],a
call Jevil_LoadFrame
ld a,1
ld [rROMB0],a
ld a,%11100111
ldh [rLCDC],a
ei
call DM_Init
; Main loop
MainLoop:
halt
call DM_Play
ld a,[sys_CurrentFrame]
inc a
ld [sys_CurrentFrame],a
rra
ldh [rSCX],a
cpl
ldh [rSCY],a
ldh a,[rLCDC]
xor %00100000
ldh [rLCDC],a
; x movement
.pixelX
ld a,[SpeedX]
bit 7,a
ld b,a
ld a,[JevilX]
jr nz,.subtractX
.addX
add b
ld [JevilX],a
jr .subpixelX
.subtractX
res 7,b
sub b
ld [JevilX],a
scf
.subpixelX
ld a,[SpeedX+1]
ld b,a
ld a,[JevilX+1]
jr c,.negativeX
add b
ld [JevilX+1],a
jr nc,.pixelY
ld hl,JevilX
inc [hl]
jr .pixelY
.negativeX
sub b
ld [JevilX+1],a
jr nc,.pixelY
ld hl,JevilX
dec [hl]
; y movement
.pixelY
ld a,[SpeedY]
bit 7,a
ld b,a
ld a,[JevilY]
jr nz,.subtractY
.addY
add b
ld [JevilY],a
jr .subpixelY
.subtractY
res 7,b
sub b
ld [JevilY],a
scf
.subpixelY
ld a,[SpeedY+1]
ld b,a
ld a,[JevilY+1]
jr c,.negativeY
add b
ld [JevilY+1],a
jr nc,.done
ld hl,JevilY
inc [hl]
jr .done
.negativeY
sub b
ld [JevilY+1],a
jr nc,.done
ld hl,JevilY
dec [hl]
.done
ld a,[JevilAnimTimer]
dec a
ld [JevilAnimTimer],a
ld a,[JevilFrame]
jr nz,.skip
ld a,6
ld [JevilAnimTimer],a
ld a,[JevilFrame]
inc a
and $7
ld [JevilFrame],a
.skip
call Jevil_LoadFrame
ld a,IEF_VBLANK
ldh [rIE],a
ei
jp MainLoop
; ==================
; Interrupt handlers
; ==================
DoVBlank::
push af
call $ff80
ld a,1
ld [sys_VBlankFlag],a
pop af
reti
DoStat::
push af
ld a,1
ld [sys_LCDCFlag],a
pop af
reti
; =============
; Misc routines
; =============
; Fill RAM with a value.
; INPUT: a = value
; hl = address
; bc = size
_FillRAM::
ld e,a
.loop
ld [hl],e
inc hl
dec bc
ld a,b
or c
jr nz,.loop
ret
; Fill up to 256 bytes of RAM with a value.
; INPUT: a = value
; hl = address
; b = size
_FillRAMSmall::
ld e,a
.loop
ld [hl],e
inc hl
dec b
jr nz,.loop
ret
; Copy up to 65536 bytes to RAM.
; INPUT: hl = source
; de = destination
; bc = size
_CopyRAM::
ld a,[hl+]
ld [de],a
inc de
dec bc
ld a,b
or c
jr nz,_CopyRAM
ret
; Copy up to 256 bytes to RAM.
; INPUT: hl = source
; de = destination
; b = size
_CopyRAMSmall::
ld a,[hl+]
ld [de],a
inc de
dec b
jr nz,_CopyRAMSmall
ret
; =======================
; Interrupt wait routines
; =======================
_WaitVBlank::
ldh a,[rIE]
bit IEF_VBLANK,a
ret z
.wait
halt
ld a,[sys_VBlankFlag]
and a
jr nz,.wait
xor a
ld [sys_VBlankFlag],a
ret
_WaitTimer::
ldh a,[rIE]
bit IEF_TIMER,a
ret z
.wait
halt
ld a,[sys_TimerFlag]
and a
jr nz,.wait
xor a
ld [sys_VBlankFlag],a
ret
_WaitLCDC::
ldh a,[rIE]
bit IEF_LCDC,a
ret z
.wait
halt
ld a,[sys_LCDCFlag]
and a
jr nz,.wait
xor a
ld [sys_LCDCFlag],a
ret
; =================
; Graphics routines
; =================
; INPUT: a = frame ID
Jevil_LoadFrame:
add $d0
ld h,a
ld l,0
ld de,$c400
ld b,$28
.loop
ld a,[hl+]
ld c,a
ld a,[JevilY]
add c
ld [de],a
inc de
ld a,[hl+]
ld c,a
ld a,[JevilX]
add c
ld [de],a
inc de
ld a,[hl+]
ld [de],a
inc de
ld a,[hl+]
ld [de],a
inc de
dec b
jr nz,.loop
ret
CopyDMARoutine::
ld bc,$80 + ((_OAM_DMA_End-_OAM_DMA) <<
ld hl,_OAM_DMA
.loop
ld a,[hl+]
ld [c],a
inc c
dec b
jr nz,.loop
ret
_OAM_DMA::
ld a,high(SpriteBuffer)
ldh [rDMA],a
ld a,$28
.wait
dec a
jr nz,.wait
ret
_OAM_DMA_End
_CopyTileset:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de
dec bc
ld a,b ; check if bc = 0
or c
jr nz,_CopyTileset ; if bc != 0, loop
ret
_CopyTilesetSafe:: ; same as _CopyTileset, but waits for VRAM accessibility before writing data
ldh a,[rSTAT]
and 2 ; check if VRAM is accessible
jr nz,_CopyTilesetSafe ; if it isn't, loop until it is
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de
dec bc
ld a,b ; check if bc = 0
or c
jr nz,_CopyTilesetSafe ; if bc != 0, loop
ret
_Copy1BPP:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de ; increment destination address
ld [de],a ; write byte again
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPP ; if bc != 0, loop
ret
_Copy1BPPInvert:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
cpl ; invert byte
ld [de],a ; write byte
inc de ; increment destination address
ld [de],a ; write byte again
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPPInvert ; if bc != 0, loop
ret
_Copy1BPPSafe:: ; same as _Copy1BPP, but waits for VRAM accessibility before writing data
ldh a,[rSTAT]
and 2 ; check if VRAM is accessible
jr nz,_Copy1BPPSafe ; if it isn't, loop until it is
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de ; increment destination address
ld [de],a ; write byte again
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPP ; if bc != 0, loop
ret
_Copy1BPPLightGray:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de ; increment destination address
xor a
ld [de],a ; write byte
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPPLightGray ; if bc != 0, loop
ret
; ========
; Includes
; ========
include "DevPack.asm"
; Scroller routines
ICanDoAnythingMap:
; I C A N D O A N Y T H I N G
db $0E,$0E,$10,$0E,$12,$14,$16,$0E,$18,$1A,$0E,$14,$16,$1B,$1E,$20,$10,$16,$22,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E
db $0E,$0E,$11,$0E,$13,$15,$17,$0E,$19,$1C,$0E,$15,$17,$1D,$1F,$21,$11,$17,$23,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E
ICanDoAnythingMapEnd
; ===========
; Jevil stub
; ===========
section "Jevil section",rom0[$500]
JevilAreaStart: ret
section "Jevil play dummy",rom0[$544]
DM_Play: ret
section "Jevil init dummy",rom0[$5ec]
DM_Init: ret
; =============
; Graphics data
; =============
section "Graphics data",romx,bank[7]
SuitsTiles: incbin "SuitsTiles.bin"
SuitsTilemap: incbin "SuitsTilemap.dpk"
ICanDoAnythingTiles: incbin "ICanDoAnything.bin"
JevilTiles: incbin "JevilTiles.bin"
JevilTilesEnd
section "Jevil frame 1",romx[$4000],bank[8]
JevilFrames:
_JevilFrame1:
db $10,$08,$54,%00000000
db $10,$10,$56,%00000000
db $10,$18,$58,%00000000
db $20,$18,$5a,%00000000
db $00,$10,$00,%00010000
db $10,$00,$02,%00010000
db $10,$08,$04,%00010000
db $10,$10,$06,%00010000
db $10,$18,$08,%00010000
db $10,$20,$0a,%00010000
db $20,$00,$0c,%00010000
db $20,$08,$0e,%00010000
db $20,$10,$10,%00010000
db $20,$18,$12,%00010000
db $20,$20,$14,%00010000
db $20,$28,$16,%00010000
section "Jevil frame 2",romx[$4100],bank[8]
_JevilFrame2:
db $00,$18,$5c,%00000000
db $10,$08,$5e,%00000000
db $10,$10,$60,%00000000
db $10,$18,$62,%00000000
db $00,$08,$18,%00010000
db $00,$10,$1a,%00010000
db $00,$18,$1c,%00010000
db $00,$20,$1e,%00010000
db $00,$28,$20,%00010000
db $10,$00,$22,%00010000
db $10,$08,$24,%00010000
db $10,$10,$26,%00010000
db $10,$18,$28,%00010000
db $10,$20,$2a,%00010000
db $10,$28,$2c,%00010000
db $20,$00,$2e,%00010000
db $20,$08,$30,%00010000
db $20,$10,$32,%00010000
db $20,$18,$34,%00010000
db $20,$20,$36,%00010000
section "Jevil frame 3",romx[$4200],bank[8]
_JevilFrame3:
db $0a,$08,$64,%00000000
db $0a,$10,$66,%00000000
db $0a,$18,$68,%00000000
db $fa,$08,$38,%00010000
db $fa,$10,$3a,%00010000
db $fa,$18,$3c,%00010000
db $0a,$00,$3e,%00010000
db $0a,$08,$40,%00010000
db $0a,$10,$42,%00010000
db $0a,$18,$44,%00010000
db $0a,$20,$46,%00010000
db $0a,$28,$48,%00010000
db $1a,$00,$4a,%00010000
db $1a,$08,$4c,%00010000
db $1a,$10,$4e,%00010000
db $1a,$18,$50,%00010000
db $1a,$20,$52,%00010000
section "Jevil frame 4",romx[$4300],bank[8]
_JevilFrame4:
db $0b,$08,$64,%00000000
db $0b,$10,$66,%00000000
db $0b,$18,$68,%00000000
db $fb,$08,$38,%00010000
db $fb,$10,$3a,%00010000
db $fb,$18,$3c,%00010000
db $0b,$00,$3e,%00010000
db $0b,$08,$40,%00010000
db $0b,$10,$42,%00010000
db $0b,$18,$44,%00010000
db $0b,$20,$46,%00010000
db $0b,$28,$48,%00010000
db $1b,$00,$4a,%00010000
db $1b,$08,$4c,%00010000
db $1b,$10,$4e,%00010000
db $1b,$18,$50,%00010000
db $1b,$20,$52,%00010000
section "Jevil frame 5",romx[$4400],bank[8]
_JevilFrame5:
db $10,$20,$54,%00100000
db $10,$18,$56,%00100000
db $10,$10,$58,%00100000
db $20,$10,$5a,%00110000
db $00,$18,$00,%00110000
db $10,$28,$02,%00110000
db $10,$20,$04,%00110000
db $10,$18,$06,%00110000
db $10,$10,$08,%00110000
db $10,$08,$0a,%00110000
db $20,$28,$0c,%00110000
db $20,$20,$0e,%00110000
db $20,$18,$10,%00110000
db $20,$10,$12,%00110000
db $20,$08,$14,%00110000
db $20,$00,$16,%00100000
section "Jevil frame 6",romx[$4500],bank[8]
_JevilFrame6:
db $00,$10,$5c,%00100000
db $10,$20,$5e,%00100000
db $10,$18,$60,%00100000
db $10,$10,$62,%00100000
db $00,$20,$18,%00110000
db $00,$18,$1a,%00110000
db $00,$10,$1c,%00110000
db $00,$08,$1e,%00110000
db $00,$00,$20,%00110000
db $10,$28,$22,%00110000
db $10,$20,$24,%00110000
db $10,$18,$26,%00110000
db $10,$10,$28,%00110000
db $10,$08,$2a,%00110000
db $10,$00,$2c,%00110000
db $20,$28,$2e,%00110000
db $20,$20,$30,%00110000
db $20,$18,$32,%00110000
db $20,$10,$34,%00110000
db $20,$08,$36,%00110000
section "Jevil frame 7",romx[$4600],bank[8]
_JevilFrame7:
db $0a,$20,$64,%00100000
db $0a,$18,$66,%00100000
db $0a,$10,$68,%00100000
db $fa,$20,$38,%00110000
db $fa,$18,$3a,%00110000
db $fa,$10,$3c,%00110000
db $0a,$28,$3e,%00110000
db $0a,$20,$40,%00110000
db $0a,$18,$42,%00110000
db $0a,$10,$44,%00110000
db $0a,$08,$46,%00110000
db $0a,$00,$48,%00110000
db $1a,$28,$4a,%00110000
db $1a,$20,$4c,%00110000
db $1a,$18,$4e,%00110000
db $1a,$10,$50,%00110000
db $1a,$08,$52,%00110000
section "Jevil frame 8",romx[$4700],bank[8]
_JevilFrame8:
db $0b,$20,$64,%00100000
db $0b,$18,$66,%00100000
db $0b,$10,$68,%00100000
db $fb,$20,$38,%00110000
db $fb,$18,$3a,%00110000
db $fb,$10,$3c,%00110000
db $0b,$28,$3e,%00110000
db $0b,$20,$40,%00110000
db $0b,$18,$42,%00110000
db $0b,$10,$44,%00110000
db $0b,$08,$46,%00110000
db $0b,$00,$48,%00110000
db $1b,$28,$4a,%00110000
db $1b,$20,$4c,%00110000
db $1b,$18,$4e,%00110000
db $1b,$10,$50,%00110000
db $1b,$08,$52,%00110000
UburL33tUzerNam- Mensagens : 1142
Data de inscrição : 2013-08-08
Localização : Somewhere
Current Project : Things
- Post n°3
Re: cmp.w #$80,$23(a0)
btw that was the source code for thisUburL33tUzerNam wrote:thanskSomeone wrote:
- Code:
; ======================
; Jevil animation by DevEd
; ======================
; If set to 1, enable debugging features.
DebugMode = 1
; Defines
include "Defines.asm"
; =============
; Reset vectors
; =============
section "Reset $00",rom0[$00]
CallHL: jp hl
section "Reset $08",rom0[$08]
FillRAM:: jp _FillRAM
section "Reset $10",rom0[$10]
WaitVBlank:: jp _WaitVBlank
section "Reset $18",rom0[$18]
WaitTimer:: jp _WaitTimer
section "Reset $20",rom0[$20]
WaitLCDC:: jp _WaitLCDC
section "Reset $30",rom0[$30]
Panic: ret ; no longer used
section "Reset $38",rom0[$38]
GenericTrap::
jp GenericTrap ; only slightly more graceful than 39 00 but i need the extra ROM space so no crash handler
; ==================
; Interrupt handlers
; ==================
section "VBlank IRQ",rom0[$40]
IRQ_VBlank:: jp DoVBlank
section "STAT IRQ",rom0[$48]
IRQ_Stat:: jp DoStat
section "Timer IRQ",rom0[$50]
IRQ_Timer:: reti
section "Serial IRQ",rom0[$58]
IRQ_Serial:: reti
section "Joypad IRQ",rom0[$60]
IRQ_Joypad:: reti
; ===============
; System routines
; ===============
include "SystemRoutines.asm"
; ==========
; ROM header
; ==========
section "ROM header",rom0[$100]
EntryPoint::
nop
jp ProgramStart
NintendoLogo: ; DO NOT MODIFY OR ROM WILL NOT BOOT!!!
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
ROMTitle: romTitle "GB REVOLVING" ; ROM title (15 bytes)
GBCSupport: db $00 ; GBC support (0 = DMG only, $80 = DMG/GBC, $C0 = GBC only)
NewLicenseCode: db "DS" ; new license code (2 bytes)
SGBSupport: db 0 ; SGB support
CartType: db $19 ; Cart type, see hardware.inc for a list of values
ROMSize: ds 1 ; ROM size (handled by post-linking tool)
RAMSize: db 2 ; RAM size
DestCode: db 1 ; Destination code (0 = Japan, 1 = All others)
OldLicenseCode: db $33 ; Old license code (if $33, check new license code)
ROMVersion: db 0 ; ROM version
HeaderChecksum: ds 1 ; Header checksum (handled by post-linking tool)
ROMChecksum: ds 2 ; ROM checksum (2 bytes) (handled by post-linking tool)
ProgramStart::
di
ld sp,$e000
push bc
push af
; disable LCD
.wait
ldh a,[rLY]
cp $90
jr nz,.wait
xor a
ldh [rLCDC],a
; init memory
ld hl,$c000 ; start of WRAM
ld bc,$1ffa ; don't clear stack
xor a
rst $08
ld hl,$8000 ; start of VRAM
ld bc,$2000
xor a
rst $08
; clear HRAM
ld bc,$7f80
xor a
.loop
ld [c],a
inc c
dec b
jr nz,.loop
call CopyDMARoutine
call $ff80 ; clear OAM
; check GB type
; sets sys_GBType to 0 if DMG/SGB/GBP/GBL/SGB2, 1 if GBC, 2 if GBA/GBA SP/GB Jevil
; TODO: Improve checks to allow for GBP/SGB/SGB2 to be detected separately
pop af
pop bc
cp $11
jr nz,.dmg
.gbc
and 1 ; a = 1
add b ; b = 1 if on GBA
ld [sys_GBType],a
jr .continue
.dmg
xor a
ld [sys_GBType],a
.continue
InitScreen:
rst $10 ; wait for VBlank
xor a
ldh [rLCDC],a
; init rendering parameters
SetDMGPal rBGP, 0,1,2,3
SetDMGPal rOBP0,0,0,2,3
SetDMGPal rOBP1,0,1,2,3
xor a
ldh [rSCX],a
ldh [rSCY],a
; apparently WX=0 means WX=SCX
inc a
ldh [rWX],a
ld a,144-16
ldh [rWY],a
ld a,IEF_VBLANK
ldh [rIE],a
ld a,7
ld [rROMB0],a
Copy1BPPLightGray SuitsTiles,$1000,14
Copy1BPP ICanDoAnythingTiles,$1100,20
CopyTileset JevilTiles,0,(JevilTilesEnd-JevilTiles)/16
ld hl,SuitsTilemap
call DevPack_Decode
ld hl,ICanDoAnythingMap
ld de,$9c00
ld b,ICanDoAnythingMapEnd-ICanDoAnythingMap
call _CopyRAMSmall
; copy jevil frame data to RAM
ld a,8
ld [rROMB0],a
ld hl,JevilFrames
ld de,$d000
ld bc,$800
call _CopyRAM
ld a,$40
ld [JevilX],a
ld a,$38
ld [JevilY],a
ld a,6
ld [JevilAnimTimer],a
xor a
ld [JevilFrame],a
call Jevil_LoadFrame
ld a,1
ld [rROMB0],a
ld a,%11100111
ldh [rLCDC],a
ei
call DM_Init
; Main loop
MainLoop:
halt
call DM_Play
ld a,[sys_CurrentFrame]
inc a
ld [sys_CurrentFrame],a
rra
ldh [rSCX],a
cpl
ldh [rSCY],a
ldh a,[rLCDC]
xor %00100000
ldh [rLCDC],a
; x movement
.pixelX
ld a,[SpeedX]
bit 7,a
ld b,a
ld a,[JevilX]
jr nz,.subtractX
.addX
add b
ld [JevilX],a
jr .subpixelX
.subtractX
res 7,b
sub b
ld [JevilX],a
scf
.subpixelX
ld a,[SpeedX+1]
ld b,a
ld a,[JevilX+1]
jr c,.negativeX
add b
ld [JevilX+1],a
jr nc,.pixelY
ld hl,JevilX
inc [hl]
jr .pixelY
.negativeX
sub b
ld [JevilX+1],a
jr nc,.pixelY
ld hl,JevilX
dec [hl]
; y movement
.pixelY
ld a,[SpeedY]
bit 7,a
ld b,a
ld a,[JevilY]
jr nz,.subtractY
.addY
add b
ld [JevilY],a
jr .subpixelY
.subtractY
res 7,b
sub b
ld [JevilY],a
scf
.subpixelY
ld a,[SpeedY+1]
ld b,a
ld a,[JevilY+1]
jr c,.negativeY
add b
ld [JevilY+1],a
jr nc,.done
ld hl,JevilY
inc [hl]
jr .done
.negativeY
sub b
ld [JevilY+1],a
jr nc,.done
ld hl,JevilY
dec [hl]
.done
ld a,[JevilAnimTimer]
dec a
ld [JevilAnimTimer],a
ld a,[JevilFrame]
jr nz,.skip
ld a,6
ld [JevilAnimTimer],a
ld a,[JevilFrame]
inc a
and $7
ld [JevilFrame],a
.skip
call Jevil_LoadFrame
ld a,IEF_VBLANK
ldh [rIE],a
ei
jp MainLoop
; ==================
; Interrupt handlers
; ==================
DoVBlank::
push af
call $ff80
ld a,1
ld [sys_VBlankFlag],a
pop af
reti
DoStat::
push af
ld a,1
ld [sys_LCDCFlag],a
pop af
reti
; =============
; Misc routines
; =============
; Fill RAM with a value.
; INPUT: a = value
; hl = address
; bc = size
_FillRAM::
ld e,a
.loop
ld [hl],e
inc hl
dec bc
ld a,b
or c
jr nz,.loop
ret
; Fill up to 256 bytes of RAM with a value.
; INPUT: a = value
; hl = address
; b = size
_FillRAMSmall::
ld e,a
.loop
ld [hl],e
inc hl
dec b
jr nz,.loop
ret
; Copy up to 65536 bytes to RAM.
; INPUT: hl = source
; de = destination
; bc = size
_CopyRAM::
ld a,[hl+]
ld [de],a
inc de
dec bc
ld a,b
or c
jr nz,_CopyRAM
ret
; Copy up to 256 bytes to RAM.
; INPUT: hl = source
; de = destination
; b = size
_CopyRAMSmall::
ld a,[hl+]
ld [de],a
inc de
dec b
jr nz,_CopyRAMSmall
ret
; =======================
; Interrupt wait routines
; =======================
_WaitVBlank::
ldh a,[rIE]
bit IEF_VBLANK,a
ret z
.wait
halt
ld a,[sys_VBlankFlag]
and a
jr nz,.wait
xor a
ld [sys_VBlankFlag],a
ret
_WaitTimer::
ldh a,[rIE]
bit IEF_TIMER,a
ret z
.wait
halt
ld a,[sys_TimerFlag]
and a
jr nz,.wait
xor a
ld [sys_VBlankFlag],a
ret
_WaitLCDC::
ldh a,[rIE]
bit IEF_LCDC,a
ret z
.wait
halt
ld a,[sys_LCDCFlag]
and a
jr nz,.wait
xor a
ld [sys_LCDCFlag],a
ret
; =================
; Graphics routines
; =================
; INPUT: a = frame ID
Jevil_LoadFrame:
add $d0
ld h,a
ld l,0
ld de,$c400
ld b,$28
.loop
ld a,[hl+]
ld c,a
ld a,[JevilY]
add c
ld [de],a
inc de
ld a,[hl+]
ld c,a
ld a,[JevilX]
add c
ld [de],a
inc de
ld a,[hl+]
ld [de],a
inc de
ld a,[hl+]
ld [de],a
inc de
dec b
jr nz,.loop
ret
CopyDMARoutine::
ld bc,$80 + ((_OAM_DMA_End-_OAM_DMA) <<
ld hl,_OAM_DMA
.loop
ld a,[hl+]
ld [c],a
inc c
dec b
jr nz,.loop
ret
_OAM_DMA::
ld a,high(SpriteBuffer)
ldh [rDMA],a
ld a,$28
.wait
dec a
jr nz,.wait
ret
_OAM_DMA_End
_CopyTileset:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de
dec bc
ld a,b ; check if bc = 0
or c
jr nz,_CopyTileset ; if bc != 0, loop
ret
_CopyTilesetSafe:: ; same as _CopyTileset, but waits for VRAM accessibility before writing data
ldh a,[rSTAT]
and 2 ; check if VRAM is accessible
jr nz,_CopyTilesetSafe ; if it isn't, loop until it is
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de
dec bc
ld a,b ; check if bc = 0
or c
jr nz,_CopyTilesetSafe ; if bc != 0, loop
ret
_Copy1BPP:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de ; increment destination address
ld [de],a ; write byte again
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPP ; if bc != 0, loop
ret
_Copy1BPPInvert:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
cpl ; invert byte
ld [de],a ; write byte
inc de ; increment destination address
ld [de],a ; write byte again
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPPInvert ; if bc != 0, loop
ret
_Copy1BPPSafe:: ; same as _Copy1BPP, but waits for VRAM accessibility before writing data
ldh a,[rSTAT]
and 2 ; check if VRAM is accessible
jr nz,_Copy1BPPSafe ; if it isn't, loop until it is
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de ; increment destination address
ld [de],a ; write byte again
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPP ; if bc != 0, loop
ret
_Copy1BPPLightGray:: ; WARNING: Do not use while LCD is on!
ld a,[hl+] ; get byte
ld [de],a ; write byte
inc de ; increment destination address
xor a
ld [de],a ; write byte
inc de ; increment destination address again
dec bc
dec bc ; since we're copying two bytes, we need to dec bc twice
ld a,b ; check if bc = 0
or c
jr nz,_Copy1BPPLightGray ; if bc != 0, loop
ret
; ========
; Includes
; ========
include "DevPack.asm"
; Scroller routines
ICanDoAnythingMap:
; I C A N D O A N Y T H I N G
db $0E,$0E,$10,$0E,$12,$14,$16,$0E,$18,$1A,$0E,$14,$16,$1B,$1E,$20,$10,$16,$22,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E
db $0E,$0E,$11,$0E,$13,$15,$17,$0E,$19,$1C,$0E,$15,$17,$1D,$1F,$21,$11,$17,$23,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E,$0E
ICanDoAnythingMapEnd
; ===========
; Jevil stub
; ===========
section "Jevil section",rom0[$500]
JevilAreaStart: ret
section "Jevil play dummy",rom0[$544]
DM_Play: ret
section "Jevil init dummy",rom0[$5ec]
DM_Init: ret
; =============
; Graphics data
; =============
section "Graphics data",romx,bank[7]
SuitsTiles: incbin "SuitsTiles.bin"
SuitsTilemap: incbin "SuitsTilemap.dpk"
ICanDoAnythingTiles: incbin "ICanDoAnything.bin"
JevilTiles: incbin "JevilTiles.bin"
JevilTilesEnd
section "Jevil frame 1",romx[$4000],bank[8]
JevilFrames:
_JevilFrame1:
db $10,$08,$54,%00000000
db $10,$10,$56,%00000000
db $10,$18,$58,%00000000
db $20,$18,$5a,%00000000
db $00,$10,$00,%00010000
db $10,$00,$02,%00010000
db $10,$08,$04,%00010000
db $10,$10,$06,%00010000
db $10,$18,$08,%00010000
db $10,$20,$0a,%00010000
db $20,$00,$0c,%00010000
db $20,$08,$0e,%00010000
db $20,$10,$10,%00010000
db $20,$18,$12,%00010000
db $20,$20,$14,%00010000
db $20,$28,$16,%00010000
section "Jevil frame 2",romx[$4100],bank[8]
_JevilFrame2:
db $00,$18,$5c,%00000000
db $10,$08,$5e,%00000000
db $10,$10,$60,%00000000
db $10,$18,$62,%00000000
db $00,$08,$18,%00010000
db $00,$10,$1a,%00010000
db $00,$18,$1c,%00010000
db $00,$20,$1e,%00010000
db $00,$28,$20,%00010000
db $10,$00,$22,%00010000
db $10,$08,$24,%00010000
db $10,$10,$26,%00010000
db $10,$18,$28,%00010000
db $10,$20,$2a,%00010000
db $10,$28,$2c,%00010000
db $20,$00,$2e,%00010000
db $20,$08,$30,%00010000
db $20,$10,$32,%00010000
db $20,$18,$34,%00010000
db $20,$20,$36,%00010000
section "Jevil frame 3",romx[$4200],bank[8]
_JevilFrame3:
db $0a,$08,$64,%00000000
db $0a,$10,$66,%00000000
db $0a,$18,$68,%00000000
db $fa,$08,$38,%00010000
db $fa,$10,$3a,%00010000
db $fa,$18,$3c,%00010000
db $0a,$00,$3e,%00010000
db $0a,$08,$40,%00010000
db $0a,$10,$42,%00010000
db $0a,$18,$44,%00010000
db $0a,$20,$46,%00010000
db $0a,$28,$48,%00010000
db $1a,$00,$4a,%00010000
db $1a,$08,$4c,%00010000
db $1a,$10,$4e,%00010000
db $1a,$18,$50,%00010000
db $1a,$20,$52,%00010000
section "Jevil frame 4",romx[$4300],bank[8]
_JevilFrame4:
db $0b,$08,$64,%00000000
db $0b,$10,$66,%00000000
db $0b,$18,$68,%00000000
db $fb,$08,$38,%00010000
db $fb,$10,$3a,%00010000
db $fb,$18,$3c,%00010000
db $0b,$00,$3e,%00010000
db $0b,$08,$40,%00010000
db $0b,$10,$42,%00010000
db $0b,$18,$44,%00010000
db $0b,$20,$46,%00010000
db $0b,$28,$48,%00010000
db $1b,$00,$4a,%00010000
db $1b,$08,$4c,%00010000
db $1b,$10,$4e,%00010000
db $1b,$18,$50,%00010000
db $1b,$20,$52,%00010000
section "Jevil frame 5",romx[$4400],bank[8]
_JevilFrame5:
db $10,$20,$54,%00100000
db $10,$18,$56,%00100000
db $10,$10,$58,%00100000
db $20,$10,$5a,%00110000
db $00,$18,$00,%00110000
db $10,$28,$02,%00110000
db $10,$20,$04,%00110000
db $10,$18,$06,%00110000
db $10,$10,$08,%00110000
db $10,$08,$0a,%00110000
db $20,$28,$0c,%00110000
db $20,$20,$0e,%00110000
db $20,$18,$10,%00110000
db $20,$10,$12,%00110000
db $20,$08,$14,%00110000
db $20,$00,$16,%00100000
section "Jevil frame 6",romx[$4500],bank[8]
_JevilFrame6:
db $00,$10,$5c,%00100000
db $10,$20,$5e,%00100000
db $10,$18,$60,%00100000
db $10,$10,$62,%00100000
db $00,$20,$18,%00110000
db $00,$18,$1a,%00110000
db $00,$10,$1c,%00110000
db $00,$08,$1e,%00110000
db $00,$00,$20,%00110000
db $10,$28,$22,%00110000
db $10,$20,$24,%00110000
db $10,$18,$26,%00110000
db $10,$10,$28,%00110000
db $10,$08,$2a,%00110000
db $10,$00,$2c,%00110000
db $20,$28,$2e,%00110000
db $20,$20,$30,%00110000
db $20,$18,$32,%00110000
db $20,$10,$34,%00110000
db $20,$08,$36,%00110000
section "Jevil frame 7",romx[$4600],bank[8]
_JevilFrame7:
db $0a,$20,$64,%00100000
db $0a,$18,$66,%00100000
db $0a,$10,$68,%00100000
db $fa,$20,$38,%00110000
db $fa,$18,$3a,%00110000
db $fa,$10,$3c,%00110000
db $0a,$28,$3e,%00110000
db $0a,$20,$40,%00110000
db $0a,$18,$42,%00110000
db $0a,$10,$44,%00110000
db $0a,$08,$46,%00110000
db $0a,$00,$48,%00110000
db $1a,$28,$4a,%00110000
db $1a,$20,$4c,%00110000
db $1a,$18,$4e,%00110000
db $1a,$10,$50,%00110000
db $1a,$08,$52,%00110000
section "Jevil frame 8",romx[$4700],bank[8]
_JevilFrame8:
db $0b,$20,$64,%00100000
db $0b,$18,$66,%00100000
db $0b,$10,$68,%00100000
db $fb,$20,$38,%00110000
db $fb,$18,$3a,%00110000
db $fb,$10,$3c,%00110000
db $0b,$28,$3e,%00110000
db $0b,$20,$40,%00110000
db $0b,$18,$42,%00110000
db $0b,$10,$44,%00110000
db $0b,$08,$46,%00110000
db $0b,$00,$48,%00110000
db $1b,$28,$4a,%00110000
db $1b,$20,$4c,%00110000
db $1b,$18,$4e,%00110000
db $1b,$10,$50,%00110000
db $1b,$08,$52,%00110000
UburL33tUzerNam- Mensagens : 1142
Data de inscrição : 2013-08-08
Localização : Somewhere
Current Project : Things
you better not have run that rom in visualboyadvanceNo one wrote:lol wut