diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 3dd9adb..57ed8d2 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -26,7 +26,7 @@ org $3FFFFF ; <- 1FFFFF db #$00 ; expand file to 2mb org $1FFFF8 ; <- FFFF8 timestamp rom -db #$20, #$18, #$01, #$20 ; year/month/day +db #$20, #$18, #$01, #$21 ; year/month/day ;================================================================================ @@ -140,6 +140,10 @@ warnpc $1CF356 org $A18000 ; static mapping area incsrc framehook.asm +warnpc $A18800 + +org $A18800 ; static mapping area +incsrc zsnes.asm warnpc $A19000 org $A1FF00 ; static mapping area diff --git a/hooks.asm b/hooks.asm index 598d92b..c8f5cfc 100644 --- a/hooks.asm +++ b/hooks.asm @@ -22,6 +22,14 @@ org $0080D0 ; <- D0 - Bank00.asm : 164 (PHA : PHX : PHY : PHD : PHB) NMIHookReturn: ;-------------------------------------------------------------------------------- +;================================================================================ +; Anti-ZSNES Hook +;-------------------------------------------------------------------------------- +org $008023 ;<- 23 - Bank00.asm : 36 (LDA.w #$01FF : TCS) +JML.l CheckZSNES +ReturnCheckZSNES: +;-------------------------------------------------------------------------------- + ;================================================================================ ; Dungeon Entrance Hook ;-------------------------------------------------------------------------------- diff --git a/shopkeeper.asm b/shopkeeper.asm index 6bc877a..49d1d08 100644 --- a/shopkeeper.asm +++ b/shopkeeper.asm @@ -127,8 +127,9 @@ RTS !FREE_TILE_BUFFER = "#$1180" !SHOP_ID = "$7F5050" !SHOP_TYPE = "$7F5051" -!SHOP_INVENTORY = "$7F5051" +!SHOP_INVENTORY = "$7F5052" !SCRATCH_CAPACITY = "$7F5020" +!SCRATCH_TEMP_X = "$7F5021" ;-------------------------------------------------------------------------------- .digit_properties dw $0230, $0231, $0202, $0203, $0212, $0213, $0222, $0223, $0232, $0233 @@ -302,21 +303,7 @@ Sprite_ShopKeeper: LDA $92 : INC #2 : STA $92 ; Draw Items - LDA.b #$03 : STA $06 ; request 3 OAM slots - LDA $20 : CMP.b #$60 : !BGE .below - .above - LDA #$0C : JSL.l OAM_AllocateFromRegionA : BRA + ; request 12 bytes - .below - LDA #$0C : JSL.l OAM_AllocateFromRegionB ; request 12 bytes - + - LDA.b #$03 : STA $06 ; request 3 OAM slots - STZ $07 - LDA.b #.oam_items : STA $08 - LDA.b #.oam_items>>8 : STA $09 - JSL.l Sprite_DrawMultiple_quantity_preset - LDA $90 : !ADD.b #$04*3 : STA $90 ; increment oam pointer - LDA $92 : INC #3 : STA $92 - + JSR.w Shopkeeper_DrawItems LDA.b #$00 : STA.l !SKIP_EOR @@ -393,24 +380,122 @@ dw 0, 0 : db $10, $0C, $00, $02 dw 0, -8 : db $00, $0C, $00, $02 dw 0, 0 : db $10, $4C, $00, $02 ;-------------------------------------------------------------------------------- -.oam_items -dw -40, 40 : db $C0, $08, $00, $02 -dw 8, 40 : db $C2, $04, $00, $02 -dw 56, 40 : db $C4, $02, $00, $02 -;-------------------------------------------------------------------------------- -.oam_prices -dw -48, 56 : db $30, $02, $00, $00 -dw -40, 56 : db $31, $02, $00, $00 -dw -32, 56 : db $02, $02, $00, $00 -dw -24, 56 : db $03, $02, $00, $00 +;!SHOP_TYPE = "$7F5051" +;!SHOP_INVENTORY = "$7F5052" +!SPRITE_OAM = "$7EC025" +Shopkeeper_DrawItems: + PHB : PHK : PLB + PHX : PHY + TXA : STA !SCRATCH_TEMP_X; + LDX.b #$00 + LDY.b #$00 + LDA !SHOP_TYPE : AND.b #$03 + CMP.b #$03 : BNE + + JSR.w Shopkeeper_DrawNextItem : BRA ++ + + CMP.b #$02 : BNE + : ++ + JSR.w Shopkeeper_DrawNextItem : BRA ++ + + CMP.b #$01 : BNE + : ++ + JSR.w Shopkeeper_DrawNextItem + + + PLY : PLX + PLB +RTS -dw 0, 56 : db $12, $02, $00, $00 -dw 8, 56 : db $13, $02, $00, $00 -dw 16, 56 : db $22, $02, $00, $00 -dw 24, 56 : db $23, $02, $00, $00 - -dw 48, 56 : db $32, $02, $00, $00 -dw 56, 56 : db $33, $02, $00, $00 -dw 64, 56 : db $30, $02, $00, $00 -dw 72, 56 : db $31, $02, $00, $00 +;-------------------------------------------------------------------------------- +Shopkeeper_DrawNextItem: + PHY + TYA : ASL #2 : TAY + REP #$20 ; set 16-bit accumulator + LDA.w .item_offsets, Y : STA.l !SPRITE_OAM + LDA.w .item_offsets+2, Y : STA.l !SPRITE_OAM+2 + SEP #$20 ; set 8-bit accumulator + PLY + + LDA.w .tile_indices, Y ; get item gfx index + STA.l !SPRITE_OAM+4 + + LDA.l !SHOP_INVENTORY, X ; get item palette + JSL.l GetSpritePalette : STA.l !SPRITE_OAM+5 + + LDA.b #$00 : STA.l !SPRITE_OAM+6 + + LDA.l !SHOP_INVENTORY, X ; get item palette + JSL.l IsNarrowSprite : BCS .narrow + .full + LDA.b #$02 + STA.l !SPRITE_OAM+7 + LDA.b #$01 + BRA ++ + .narrow + LDA.b #$00 + STA.l !SPRITE_OAM+7 + JSR.w PrepNarrowLower + LDA.b #$02 + ++ + PHX : PHA : LDA !SCRATCH_TEMP_X : TAX : PLA : JSR.w RequestItemOAM : PLX + INY + INX #3 +RTS +;-------------------------------------------------------------------------------- +.item_offsets +dw -40, 40 +dw 8, 40 +dw 56, 40 +.tile_indices +db $C0, $C2, $C4 +;-------------------------------------------------------------------------------- +RequestItemOAM: + PHX : PHY : PHA + STA $06 ; request A OAM slots + LDA $20 : CMP.b #$60 : !BGE .below + .above + LDA 1,s : ASL #2 : JSL.l OAM_AllocateFromRegionA : BRA + ; request 4A bytes + BRA + + .below + LDA 1,s : ASL #2 : JSL.l OAM_AllocateFromRegionB ; request 4A bytes + + + LDA 1,s : STA $06 ; request 3 OAM slots + STZ $07 + LDA.b #!SPRITE_OAM : STA $08 + LDA.b #!SPRITE_OAM>>8 : STA $09 + LDA #$7E : PHB : PHA : PLB + JSL Sprite_DrawMultiple_quantity_preset + PLB + LDA 1,s : ASL #2 : !ADD $90 : STA $90 ; increment oam pointer + LDA $92 : !ADD 1,s : STA $92 + PLA : PLY : PLX +RTS +;-------------------------------------------------------------------------------- +PrepNarrowLower: + PHX + LDX.b #$00 + REP #$20 ; set 16-bit accumulator + LDA !SPRITE_OAM, X : !ADD.w #$0004 : STA !SPRITE_OAM, X : STA !SPRITE_OAM+8, X + LDA !SPRITE_OAM+2, X : !ADD.w #$0008 : STA !SPRITE_OAM+10, X + LDA !SPRITE_OAM+4, X : !ADD.w #$0010 : STA !SPRITE_OAM+12, X + LDA !SPRITE_OAM+6, X : STA !SPRITE_OAM+14, X + SEP #$20 ; set 8-bit accumulator + PLX +RTS +;-------------------------------------------------------------------------------- +;.oam_items +;dw -40, 40 : db $C0, $08, $00, $02 +;dw 8, 40 : db $C2, $04, $00, $02 +;dw 56, 40 : db $C4, $02, $00, $02 +;-------------------------------------------------------------------------------- +;.oam_prices +;dw -48, 56 : db $30, $02, $00, $00 +;dw -40, 56 : db $31, $02, $00, $00 +;dw -32, 56 : db $02, $02, $00, $00 +;dw -24, 56 : db $03, $02, $00, $00 +; +;dw 0, 56 : db $12, $02, $00, $00 +;dw 8, 56 : db $13, $02, $00, $00 +;dw 16, 56 : db $22, $02, $00, $00 +;dw 24, 56 : db $23, $02, $00, $00 +; +;dw 48, 56 : db $32, $02, $00, $00 +;dw 56, 56 : db $33, $02, $00, $00 +;dw 64, 56 : db $30, $02, $00, $00 +;dw 72, 56 : db $31, $02, $00, $00 ;-------------------------------------------------------------------------------- diff --git a/zsnes.asm b/zsnes.asm new file mode 100644 index 0000000..d72695e --- /dev/null +++ b/zsnes.asm @@ -0,0 +1,109 @@ +;-------------------------------------------------------------------------------- +CheckZSNES: + SEP #$28 + LDA #$FF + CLC + ADC #$FF + CMP #$64 + CLD + BEQ .zsnes + REP #$20 + LDA #$01FF : TCS ; thing we wrote over - initialize stack +JML.l ReturnCheckZSNES +.zsnes +; Set up video mode + SEP #$30 ; X,Y,A are 8 bit numbers + LDA #$80 ; screen off + STA $2100 ; brightness + screen enable register + LDA #$03 + STA $2105 ; video mode 3, 8x8 tiles, 256 color BG1, 16 color BG2 + STZ $2106 ; noplanes, no mosaic, = Mosaic register + LDA #$01 + STA $210B ; Set BG1 tile data offset to $2000 + STZ $210D ; Plane 0 scroll x (first 8 bits) + STZ $210D ; Plane 0 scroll x (last 3 bits) #$0 - #$07ff + LDA #$01 + STA $212C ; Enable BG1 + LDA #$FF + STA $210E ; Set BG1 scroll register + STA $210E + STZ $212E ; Window mask for Main Screen + STZ $212F ; Window mask for Sub Screen + LDA #$30 + STA $2130 ; Color addition & screen addition init setting + STZ $2131 ; Add/Sub sub designation for screen, sprite, color + LDA #$E0 + STA $2132 ; color data for addition/subtraction + STZ $2133 ; Screen setting (interlace x,y/enable SFX data) + STZ $4200 ; Disable V-blank, interrupt, Joypad register + + REP #$10 + + +; Load tilemap and tile data + STZ $2116 + LDA #$0C + STA $2107 ; Set BG1 tilemap offset to $1800 and size to 32x32 + STA $2117 ; VRAM write address $1800 + + LDA #$80 + STA $2115 ; VRAM single word transfer, word increment + LDX #$1801 + STX $4300 ; DMA destination: VMDATAL/VMDATAH, fixed source + LDX.w #ZSNES_TileMap + STX $4302 ; Low DMA source address + LDA.b #ZSNES_TileMap>>16 + STA $4304 ; High DMA source address + LDX.w #$800 + STX $4305 ; Transfer 2048 bytes + LDA #$01 + STA $420B ; Start DMA transfer + + LDX.w #ZSNES_Tiles + STX $4302 ; Low DMA source address + LDA.b #ZSNES_Tiles>>16 + STA $4304 ; High DMA source address + LDX.w #$8000 + STX $4305 ; Transfer 32768 bytes + LDA #$01 + STA $420B ; Start DMA transfer + + LDX.w #$8000 + STX $4302 ; Low DMA source address + LDA.b #$38 ; (ZSNES_Tiles>>16)+1 + STA $4304 ; High DMA source address + LDX.w #$6040 + STX $4305 ; Transfer 24640 bytes + LDA #$01 + STA $420B ; Start DMA transfer + +; Load CGRAM via DMA transfer + + STZ $2121 ; Start at color 0 + LDX #$2200 + STX $4300 ; DMA destination: CGDATA, byte increment + LDX.w #ZSNES_Palette + STX $4302 ; Low DMA source address + LDA.b #ZSNES_Palette>>16 + STA $4304 ; High DMA source address + LDX #$0200 + STX $4305 ; Transfer 512 bytes + LDA #$01 + STA $420B ; Start DMA transfer + + LDA #$0F ; screen on, full brightness + STA $2100 ; brightness + screen enable register + +STP ; ! +;-------------------------------------------------------------------------------- +org $378000 + +ZSNES_Tiles: + incbin zsnes_tiles.bin + +ZSNES_TileMap: + incbin zsnes_tilemap.bin + +ZSNES_Palette: + incbin zsnes_pal.bin + \ No newline at end of file diff --git a/zsnes_pal.bin b/zsnes_pal.bin new file mode 100644 index 0000000..54e5887 Binary files /dev/null and b/zsnes_pal.bin differ diff --git a/zsnes_tilemap.bin b/zsnes_tilemap.bin new file mode 100644 index 0000000..ec4f321 Binary files /dev/null and b/zsnes_tilemap.bin differ diff --git a/zsnes_tiles.bin b/zsnes_tiles.bin new file mode 100644 index 0000000..b272958 Binary files /dev/null and b/zsnes_tiles.bin differ