generated from Dario48/smb_from_ass
Initial commit
This commit is contained in:
commit
0c07c770a9
14 changed files with 20819 additions and 0 deletions
3
.envrc
Normal file
3
.envrc
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
use flake
|
||||
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
result
|
||||
smb.nes.dbg
|
||||
smb.map
|
||||
smb.nes
|
||||
smb.nes.ndx
|
||||
obj/nes/smbdishl.o
|
||||
obj/nes/smb.d
|
||||
chr/
|
||||
src/smb_chr.chr
|
||||
.direnv
|
||||
29
Makefile
Normal file
29
Makefile
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
cl65 ?= cl65
|
||||
|
||||
.PHONY: build debug clean
|
||||
|
||||
build: smb.nes
|
||||
|
||||
debug: OBJ_DEBUG_ARGS = --create-dep obj/nes/smb.d -v -g
|
||||
debug: ROM_DEBUG_ARGS = -Wl --dbgfile,smb.nes.dbg
|
||||
debug: build
|
||||
|
||||
obj/nes/smbdishl.o: src/smbdishl.s src/smb_chr.chr
|
||||
$(cl65) -t none -c $(OBJ_DEBUG_ARGS) --include-dir src -o $@ $<
|
||||
|
||||
smb.nes smb.map: obj/nes/smbdishl.o src/nes.cfg
|
||||
$(cl65) -t none --mapfile smb.map $(ROM_DEBUG_ARGS) -o smb.nes -C src/nes.cfg $<
|
||||
|
||||
src/smb_chr.chr:
|
||||
if [ -s chr/smb_chr.chr ]; then \
|
||||
if [ -s src/smb_chr.chr ]; then \
|
||||
cmp -s $@ chr/smb_chr.chr || cp chr/smb_chr.chr $@ \
|
||||
else \
|
||||
cp chr/smb_chr.chr \
|
||||
fi \
|
||||
else \
|
||||
[ -s src/smb_chr.chr ] || $(error missing chr)\
|
||||
fi
|
||||
|
||||
clean:
|
||||
rm -f smb.nes.dbg smb.map smb.nes smb.nes.ndx obj/nes/smbdishl.o obj/nes/smb.d
|
||||
11
README.MD
Normal file
11
README.MD
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
Building:
|
||||
|
||||
NOTE: "chr/smb_chr.chr" is required to assemble. (Not included.)
|
||||
|
||||
Run either `make`, or `make debug`
|
||||
|
||||
They both will build the .nes rom, but one will also output debug data.
|
||||
(Try it and load the rom in NintendulatorDX and step through the code.)
|
||||
`make clean` will just delete all files in that could be created by either `make`
|
||||
|
||||
all the credit to [Movax12](https://www.romhacking.net/community/2056/), original version available at [romhacking.net](https://www.romhacking.net/documents/635/)
|
||||
102
flake.lock
generated
Normal file
102
flake.lock
generated
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1778716662,
|
||||
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nesrx": {
|
||||
"inputs": {
|
||||
"flake-parts": [
|
||||
"flake-parts"
|
||||
],
|
||||
"nesrx": "nesrx_2",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1779540575,
|
||||
"narHash": "sha256-sfmoaOR9wN6H8jJyBKC1VBVd9cuf1l8bch+0uf/O/5s=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "b1cfcfb6ed2d8e4d3a93a94bae58cdbf6ebd9bea",
|
||||
"revCount": 3,
|
||||
"type": "git",
|
||||
"url": "https://dario48.site/git/Dario48/nesrx-flake.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://dario48.site/git/Dario48/nesrx-flake.git"
|
||||
}
|
||||
},
|
||||
"nesrx_2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1657372504,
|
||||
"narHash": "sha256-Nnu+Jncw7k+7sE4AL9xjbm6dNVt8ZuKW/8tdKmm4G9Q=",
|
||||
"owner": "xms0g",
|
||||
"repo": "nesrx",
|
||||
"rev": "573e008d84bb8b6b86e7f2111211175d01ea018c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "xms0g",
|
||||
"repo": "nesrx",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1779357205,
|
||||
"narHash": "sha256-cCO8aTqss5x9Ky8GWkpY0Hy5fyTZEbtifSUV8QjSzic=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "f83fc3c307e74bc5fd5adb7eb6b8b13ffd2a36e1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1777168982,
|
||||
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-parts": "flake-parts",
|
||||
"nesrx": "nesrx",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
56
flake.nix
Normal file
56
flake.nix
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
{
|
||||
description = "A basic Bun project template for JavaScript/TypeScript development.";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
nesrx = {
|
||||
url = "git+https://dario48.site/git/Dario48/nesrx-flake.git";
|
||||
inputs = {
|
||||
nixpkgs.follows = "nixpkgs";
|
||||
flake-parts.follows = "flake-parts";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
outputs =
|
||||
inputs:
|
||||
inputs.flake-parts.lib.mkFlake { inherit inputs; } {
|
||||
imports = [ ];
|
||||
|
||||
systems = builtins.attrNames inputs.nixpkgs.legacyPackages;
|
||||
|
||||
perSystem =
|
||||
{
|
||||
config,
|
||||
system,
|
||||
pkgs,
|
||||
self',
|
||||
...
|
||||
}:
|
||||
{
|
||||
_module.args.pkgs = import inputs.nixpkgs {
|
||||
inherit system;
|
||||
overlays = [
|
||||
inputs.nesrx.overlays.default
|
||||
];
|
||||
};
|
||||
devShells.default = pkgs.mkShellNoCC {
|
||||
inputsFrom = [ self'.packages.default ];
|
||||
packages = with pkgs; [
|
||||
nesrx
|
||||
fceux
|
||||
];
|
||||
};
|
||||
packages.default = pkgs.stdenvNoCC.mkDerivation {
|
||||
name = "smbOneOne";
|
||||
src = ./.;
|
||||
dontInstall = true;
|
||||
nativeBuildInputs = with pkgs; [ cc65 ];
|
||||
};
|
||||
packages.debug = config.packages.default.overrideAttrs (_: {
|
||||
buildStep = "make debug";
|
||||
});
|
||||
};
|
||||
};
|
||||
}
|
||||
3
src/MISSING_CHRROM_readthis.txt
Normal file
3
src/MISSING_CHRROM_readthis.txt
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
copy 8k
|
||||
"smb_chr.chr"
|
||||
file to this folder
|
||||
2057
src/ca65hl.h
Normal file
2057
src/ca65hl.h
Normal file
File diff suppressed because it is too large
Load diff
34
src/ca65hl_defines.h
Normal file
34
src/ca65hl_defines.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
|
||||
; BELOW: .defines for recognized flag tests. Format: Flag to test for and default setting.
|
||||
; These are not required for the macro code to function
|
||||
|
||||
.define less C clear
|
||||
.define greaterORequal C set
|
||||
.define carry C set
|
||||
.define zero Z set
|
||||
.define equal Z set
|
||||
.define plus N clear
|
||||
.define positive N clear
|
||||
.define minus N set
|
||||
.define negative N set
|
||||
.define bit7 N set
|
||||
.define overflow V set
|
||||
.define bit6 V set
|
||||
.define bitset Z clear
|
||||
|
||||
.define greater G set ; Use greater and less/equal macros to simulate
|
||||
.define lessORequal G clear
|
||||
|
||||
; define symbols for AND, OR, NOT, must use recognized ca65 tokens or valid ident-like strings
|
||||
; These are required for all functions to work
|
||||
|
||||
|
||||
.define _HL_MACRO_USER_AND_DEFINITION_ && ; '&&' will match '.and'
|
||||
.define _HL_MACRO_USER_OR_DEFINITION_ || ; '||' will match '.or'
|
||||
.define _HL_MACRO_USER_NOT_DEFINITION1_ not
|
||||
.define _HL_MACRO_USER_NOT_DEFINITION2_ ! ; wil match '.not'
|
||||
.define _HL_MACRO_USER_GOTO_DEFINITION_ goto ; if condition goto label
|
||||
|
||||
; maximum iny/dey/inx/dex commands created by a +/- in an expression with x or y reg before a warning
|
||||
.define _MB_MAXIMUM_ADD_OR_SUB_X_OR_Y_ 6
|
||||
|
||||
706
src/memory.h
Normal file
706
src/memory.h
Normal file
|
|
@ -0,0 +1,706 @@
|
|||
; Memory layout for smbdis
|
||||
|
||||
; Consants
|
||||
|
||||
; GAME SPECIFIC DEFINES
|
||||
|
||||
; -------------------------------------------------------------------------------------------------------
|
||||
; ----------------------------Constants------------------------------------------------------------------
|
||||
; -------------------------------------------------------------------------------------------------------
|
||||
|
||||
; sound effects constants
|
||||
|
||||
SFX_SmallJump = %10000000
|
||||
SFX_Flagpole = %01000000
|
||||
SFX_Fireball = %00100000
|
||||
SFX_PipeDown_Injury = %00010000
|
||||
SFX_EnemySmack = %00001000
|
||||
SFX_EnemyStomp = %00000100
|
||||
SFX_Bump = %00000010
|
||||
SFX_BigJump = %00000001
|
||||
|
||||
SFX_BowserFall = %10000000
|
||||
SFX_ExtraLife = %01000000
|
||||
SFX_PowerUpGrab = %00100000
|
||||
SFX_TimerTick = %00010000
|
||||
SFX_Blast = %00001000
|
||||
SFX_GrowVine = %00000100
|
||||
SFX_GrowPowerUp = %00000010
|
||||
SFX_CoinGrab = %00000001
|
||||
|
||||
SFX_BowserFlame = %00000010
|
||||
SFX_BrickShatter = %00000001
|
||||
; music constants
|
||||
|
||||
MUSIC_Silence = %10000000
|
||||
MUSIC_StarPower = %01000000
|
||||
MUSIC_PipeIntro = %00100000
|
||||
MUSIC_Cloud = %00010000
|
||||
MUSIC_Castle = %00001000
|
||||
MUSIC_Underground = %00000100
|
||||
MUSIC_Water = %00000010
|
||||
MUSIC_Ground = %00000001
|
||||
MUSIC_TimeRunningOut = %01000000
|
||||
MUSIC_EndOfLevel = %00100000
|
||||
MUSIC_AltGameOver = %00010000
|
||||
MUSIC_EndOfCastle = %00001000
|
||||
MUSIC_Victory = %00000100
|
||||
MUSIC_GameOver = %00000010
|
||||
MUSIC_Death = %00000001
|
||||
|
||||
; enemy object constants
|
||||
|
||||
OBJECTID_GreenKoopa = $00
|
||||
OBJECTID_BuzzyBeetle = $02
|
||||
OBJECTID_RedKoopa = $03
|
||||
OBJECTID_HammerBro = $05
|
||||
OBJECTID_Goomba = $06
|
||||
OBJECTID_Bloober = $07
|
||||
OBJECTID_BulletBill_FrenzyVar = $08
|
||||
OBJECTID_TallEnemy = $09
|
||||
OBJECTID_GreyCheepCheep = $0a
|
||||
OBJECTID_RedCheepCheep = $0b
|
||||
OBJECTID_Podoboo = $0c
|
||||
OBJECTID_PiranhaPlant = $0d
|
||||
OBJECTID_GreenParatroopaJump = $0e
|
||||
OBJECTID_RedParatroopa = $0f
|
||||
OBJECTID_GreenParatroopaFly = $10
|
||||
OBJECTID_Lakitu = $11
|
||||
OBJECTID_Spiny = $12
|
||||
OBJECTID_FlyingCheepCheep = $14
|
||||
OBJECTID_FlyCheepCheepFrenzy = $14
|
||||
OBJECTID_BowserFlame = $15
|
||||
OBJECTID_Fireworks = $16
|
||||
OBJECTID_BBill_CCheep_Frenzy = $17
|
||||
OBJECTID_Stop_Frenzy = $18
|
||||
OBJECTID_Bowser = $2d
|
||||
OBJECTID_PowerUpObject = $2e
|
||||
OBJECTID_VineObject = $2f
|
||||
OBJECTID_FlagpoleFlagObject = $30
|
||||
OBJECTID_StarFlagObject = $31
|
||||
OBJECTID_JumpspringObject = $32
|
||||
OBJECTID_BulletBill_CannonVar = $33
|
||||
OBJECTID_RetainerObject = $35
|
||||
|
||||
; other constants
|
||||
|
||||
.enum
|
||||
WORLD1
|
||||
WORLD2
|
||||
WORLD3
|
||||
WORLD4
|
||||
WORLD5
|
||||
WORLD6
|
||||
WORLD7
|
||||
WORLD8
|
||||
.endenum
|
||||
|
||||
.enum
|
||||
LEVEL1
|
||||
LEVEL2
|
||||
LEVEL3
|
||||
LEVEL4
|
||||
.endenum
|
||||
|
||||
.enum
|
||||
MODE_TITLESCREEN
|
||||
MODE_GAMEPLAY
|
||||
MODE_VICTORY
|
||||
MODE_GAMEOVER
|
||||
.endenum
|
||||
|
||||
; additional HL conditional defines
|
||||
|
||||
.define BigMario Z set ; \ for use with ' PlayerSize '
|
||||
.define SmallMario Z clear ; /
|
||||
|
||||
WarmBootOffset = <_WarmBootOffset
|
||||
ColdBootOffset = <_ColdBootOffset
|
||||
|
||||
TitleScreenDataOffset = $1ec0 ; address in CHR ROM for titlescreen nametable layout
|
||||
|
||||
; -------------------------------------------------------------------------------------------------------
|
||||
; ------------------------------R -------A --------M ----------------------------------------------------
|
||||
; -------------------------------------------------------------------------------------------------------
|
||||
|
||||
.segment "ZEROPAGE"
|
||||
|
||||
temp_byte: .res 8 ; local temp pointers and vars
|
||||
ObjectOffset: .res 1
|
||||
FrameCounter: .res 1
|
||||
A_B_Buttons: .res 1
|
||||
Up_Down_Buttons: .res 1
|
||||
Left_Right_Buttons: .res 1
|
||||
PreviousA_B_Buttons: .res 1
|
||||
GameEngineSubroutine: .res 1
|
||||
Enemy_Flag: .res 7
|
||||
Enemy_ID : .res 7
|
||||
|
||||
;--------------------------- Obj State:
|
||||
|
||||
Player_State: .res 1
|
||||
; on ground = 0
|
||||
; swimming = 1
|
||||
; falling = 2
|
||||
; ClimbmingVine = 3
|
||||
|
||||
Enemy_State: .res 6
|
||||
Fireball_State: .res 2
|
||||
Block_State: .res 4
|
||||
Misc_State: .res 9
|
||||
|
||||
;---------------------------
|
||||
|
||||
PlayerFacingDir: .res 1 ; 1 = right, 2 = left
|
||||
FirebarSpinDirection:
|
||||
DestinationPageLoc: .res 1
|
||||
VictoryWalkControl: .res 4
|
||||
PowerUpType: .res 1 ; 0 = shroom, 1 = fireflower, 2 = star, 3 = 1up shroom
|
||||
FireballBouncingFlag: .res 2
|
||||
HammerBroJumpTimer: .res 9
|
||||
Player_MovingDir: .res 1
|
||||
Enemy_MovingDir: .res 17
|
||||
|
||||
|
||||
;--------------------------- X speed
|
||||
SprObject_X_Speed:
|
||||
|
||||
Player_X_Speed: .res 1
|
||||
|
||||
Enemy_X_Speed:
|
||||
LakituMoveSpeed:
|
||||
PiranhaPlant_Y_Speed:
|
||||
ExplosionGfxCounter:
|
||||
Jumpspring_FixedYPos:
|
||||
RedPTroopaCenterYPos:
|
||||
BlooperMoveSpeed:
|
||||
XMoveSecondaryCounter:
|
||||
CheepCheepMoveMFlag:
|
||||
FirebarSpinState_Low:
|
||||
YPlatformCenterYPos: .res 6
|
||||
|
||||
Fireball_X_Speed: .res 2
|
||||
Block_X_Speed: .res 4
|
||||
Misc_X_Speed: .res 9
|
||||
|
||||
;--------------------------- Obj Page Loc:
|
||||
|
||||
SprObject_PageLoc:
|
||||
Player_PageLoc: .res 1
|
||||
|
||||
Enemy_PageLoc: .res 6
|
||||
Fireball_PageLoc: .res 2
|
||||
Block_PageLoc: .res 4
|
||||
Misc_PageLoc: .res 9
|
||||
Bubble_PageLoc: .res 3
|
||||
|
||||
;--------------------------- X position
|
||||
|
||||
SprObject_X_Position:
|
||||
Player_X_Position: .res 1
|
||||
|
||||
Enemy_X_Position: .res 6
|
||||
Fireball_X_Position: .res 2
|
||||
Block_X_Position: .res 4
|
||||
Misc_X_Position: .res 9
|
||||
Bubble_X_Position: .res 3
|
||||
|
||||
;--------------------------- Y Speed
|
||||
|
||||
Player_Y_Speed:
|
||||
SprObject_Y_Speed: .res 1
|
||||
|
||||
FirebarSpinState_High:
|
||||
XMovePrimaryCounter:
|
||||
BlooperMoveCounter:
|
||||
Enemy_Y_Speed:
|
||||
LakituMoveDirection:
|
||||
ExplosionTimerCounter:
|
||||
PiranhaPlant_MoveFlag: .res 6
|
||||
|
||||
Fireball_Y_Speed: .res 2
|
||||
Block_Y_Speed: .res 4
|
||||
Misc_Y_Speed: .res 9
|
||||
|
||||
;--------------------------- Y high pos
|
||||
|
||||
SprObject_Y_HighPos:
|
||||
Player_Y_HighPos: .res 1
|
||||
|
||||
Enemy_Y_HighPos: .res 6
|
||||
Fireball_Y_HighPos: .res 2
|
||||
Block_Y_HighPos: .res 4
|
||||
Misc_Y_HighPos: .res 9
|
||||
Bubble_Y_HighPos: .res 3
|
||||
|
||||
|
||||
;--------------------------- Y position
|
||||
|
||||
Player_Y_Position:
|
||||
SprObject_Y_Position: .res 1
|
||||
|
||||
Enemy_Y_Position: .res 6
|
||||
Fireball_Y_Position: .res 2
|
||||
Block_Y_Position: .res 4
|
||||
Misc_Y_Position: .res 9
|
||||
Bubble_Y_Position: .res 3
|
||||
|
||||
;---------------------------
|
||||
|
||||
AreaData:
|
||||
AreaDataLow: .res 1
|
||||
AreaDataHigh: .res 1
|
||||
|
||||
EnemyData:
|
||||
EnemyDataLow: .res 1
|
||||
EnemyDataHigh: .res 1
|
||||
|
||||
dummylabel: .res 5 ; = start at $EB, reserve 5 bytes for local use.
|
||||
|
||||
NoteLenLookupTblOfs: .res 1
|
||||
Square1SoundBuffer: .res 1
|
||||
Square2SoundBuffer: .res 1
|
||||
NoiseSoundBuffer: .res 1
|
||||
AreaMusicBuffer: .res 1
|
||||
|
||||
MusicData:
|
||||
MusicDataLow: .res 1
|
||||
|
||||
MusicDataHigh: .res 1
|
||||
MusicOffset_Square2: .res 1
|
||||
MusicOffset_Square1: .res 1
|
||||
MusicOffset_Triangle: .res 1
|
||||
PauseSoundQueue: .res 1
|
||||
AreaMusicQueue: .res 1
|
||||
EventMusicQueue: .res 1
|
||||
NoiseSoundQueue: .res 1
|
||||
Square2SoundQueue: .res 1
|
||||
Square1SoundQueue: .res 1
|
||||
|
||||
|
||||
|
||||
.segment "STACK"
|
||||
; start $0100
|
||||
|
||||
blank_stack: .res 9 ; not used
|
||||
VerticalFlipFlag: .res 4
|
||||
FlagpoleFNum_Y_Pos: .res 1
|
||||
FlagpoleFNum_YMFDummy: .res 1
|
||||
FlagpoleScore: .res 1
|
||||
|
||||
|
||||
mystruct FloateyNum
|
||||
Control .byte 7
|
||||
X_Pos .byte 7
|
||||
Y_Pos .byte 7
|
||||
endmystruct
|
||||
|
||||
|
||||
ShellChainCounter: .res 7
|
||||
FloateyNum_Timer: .res 8
|
||||
DigitModifier: .res 6
|
||||
|
||||
|
||||
.segment "OAMRAM"
|
||||
; start $0200
|
||||
|
||||
mystruct Sprite
|
||||
.union
|
||||
Data .byte
|
||||
.struct
|
||||
Y_Position .byte
|
||||
Tilenumber .byte
|
||||
Attributes .byte
|
||||
X_Position .byte
|
||||
.endstruct
|
||||
.endunion
|
||||
endmystruct
|
||||
|
||||
.segment "BSS"
|
||||
; start $0300
|
||||
|
||||
VRAM_Buffer1_Offset: .res 1
|
||||
VRAM_Buffer1: .res 63
|
||||
VRAM_Buffer2_Offset: .res 1
|
||||
VRAM_Buffer2: .res 34 ; 26 for a column, 3 for address and size
|
||||
|
||||
BowserBodyControls: .res 1
|
||||
BowserFeetCounter: .res 1
|
||||
BowserMovementSpeed: .res 1
|
||||
BowserOrigXPos: .res 1
|
||||
BowserFlameTimerCtrl: .res 1
|
||||
BowserFront_Offset: .res 1
|
||||
BridgeCollapseOffset: .res 1
|
||||
BowserGfxFlag: .res 30
|
||||
|
||||
FirebarSpinSpeed: .res 16
|
||||
|
||||
mystruct Vine
|
||||
|
||||
FlagOffset .byte
|
||||
Height .byte
|
||||
ObjOffset .byte 3
|
||||
Start_Y_Position .byte 3
|
||||
|
||||
endmystruct
|
||||
|
||||
BalPlatformAlignment: .res 1
|
||||
Platform_X_Scroll: .res 1
|
||||
|
||||
HammerThrowingTimer:
|
||||
PlatformCollisionFlag: .res 11
|
||||
|
||||
Player_Rel_XPos:
|
||||
SprObject_Rel_XPos: .res 1
|
||||
|
||||
Enemy_Rel_XPos: .res 1
|
||||
Fireball_Rel_XPos: .res 1
|
||||
Bubble_Rel_XPos: .res 1
|
||||
Block_Rel_XPos: .res 2
|
||||
Misc_Rel_XPos: .res 5
|
||||
SprObject_Rel_YPos:
|
||||
Player_Rel_YPos: .res 1
|
||||
Enemy_Rel_YPos: .res 1
|
||||
Fireball_Rel_YPos: .res 1
|
||||
Bubble_Rel_YPos: .res 1
|
||||
Block_Rel_YPos: .res 2
|
||||
Misc_Rel_YPos: .res 6
|
||||
|
||||
Player_SprAttrib:
|
||||
SprObject_SprAttrib: .res 1
|
||||
|
||||
Enemy_SprAttrib: .res 11
|
||||
|
||||
SprObject_OffscrBits:
|
||||
Player_OffscreenBits: .res 1
|
||||
|
||||
Enemy_OffscreenBits: .res 1
|
||||
FBall_OffscreenBits: .res 1
|
||||
Bubble_OffscreenBits: .res 1
|
||||
Block_OffscreenBits: .res 2
|
||||
Misc_OffscreenBits: .res 2
|
||||
EnemyOffscrBitsMasked: .res 12
|
||||
Block_Orig_YPos: .res 2
|
||||
Block_BBuf_Low: .res 2
|
||||
Block_Metatile: .res 2
|
||||
Block_PageLoc2: .res 2
|
||||
Block_RepFlag: .res 2
|
||||
SprDataOffset_Ctrl: .res 2
|
||||
Block_ResidualCounter: .res 1
|
||||
Block_Orig_XPos: .res 8
|
||||
AttributeBuffer: .res 7
|
||||
SprObject_X_MoveForce: .res 1
|
||||
|
||||
Enemy_X_MoveForce:
|
||||
YPlatformTopYPos:
|
||||
RedPTroopaOrigXPos: .res 21
|
||||
|
||||
SprObject_YMoveForceFractional:
|
||||
Player_YMoveForceFractional: .res 1
|
||||
|
||||
Enemy_YMoveForceFractional:
|
||||
BowserFlamePRandomOfs:
|
||||
PiranhaPlantUpYPos: .res 21
|
||||
|
||||
Bubble_YMoveForceFractional: .res 7
|
||||
|
||||
Player_Y_MoveForce:
|
||||
SprObject_Y_MoveForce: .res 1
|
||||
|
||||
CheepCheepOrigYPos:
|
||||
Enemy_Y_MoveForce:
|
||||
PiranhaPlantDownYPos: .res 8
|
||||
|
||||
Block_Y_MoveForce: .res 20
|
||||
MaximumLeftSpeed: .res 6
|
||||
MaximumRightSpeed: .res 20
|
||||
|
||||
Whirlpool_Offset:
|
||||
Cannon_Offset: .res 1
|
||||
|
||||
Whirlpool_PageLoc:
|
||||
Cannon_PageLoc: .res 6
|
||||
|
||||
Cannon_X_Position:
|
||||
Whirlpool_LeftExtent: .res 6
|
||||
|
||||
Whirlpool_Length:
|
||||
Cannon_Y_Position: .res 6
|
||||
|
||||
Cannon_Timer:
|
||||
Whirlpool_Flag: .res 6
|
||||
|
||||
BowserHitPoints: .res 1
|
||||
StompChainCounter: .res 12
|
||||
Player_CollisionBits: .res 1
|
||||
Enemy_CollisionBits: .res 8
|
||||
|
||||
Player_BoundBoxCtrl:
|
||||
SprObj_BoundBoxCtrl: .res 1
|
||||
|
||||
Enemy_BoundBoxCtrl: .res 6
|
||||
Fireball_BoundBoxCtrl: .res 2
|
||||
Misc_BoundBoxCtrl: .res 10
|
||||
|
||||
BoundingBox_UL_XPos:
|
||||
BoundingBox_UL_Corner: .res 1
|
||||
|
||||
BoundingBox_UL_YPos: .res 1
|
||||
|
||||
BoundingBox_DR_XPos:
|
||||
BoundingBox_LR_Corner: .res 1
|
||||
|
||||
BoundingBox_DR_YPos: .res 1
|
||||
EnemyBoundingBoxCoord: .res 80
|
||||
Block_Buffer_1: .res 208
|
||||
Block_Buffer_2: .res 208
|
||||
BlockBufferColumnPos: .res 1
|
||||
MetatileBuffer: .res 13
|
||||
HammerEnemyOffset: .res 9
|
||||
JumpCoinMiscOffset: .res 5
|
||||
BrickCoinTimerFlag: .res 2
|
||||
Misc_Collision_Flag: .res 13
|
||||
EnemyFrenzyBuffer: .res 1
|
||||
SecondaryHardMode: .res 1
|
||||
EnemyFrenzyQueue: .res 1
|
||||
FireballCounter: .res 1
|
||||
DuplicateObj_Offset: .res 2
|
||||
LakituReappearTimer: .res 2
|
||||
NumberofGroupEnemies: .res 1 ; only used in one subroutine , HandleGroupEnemies - sub could use a temp.
|
||||
ColorRotateOffset: .res 1
|
||||
PlayerGfxOffset: .res 1
|
||||
WarpZoneControl: .res 1
|
||||
FireworksCounter: .res 2
|
||||
MultiLoopCorrectCntr: .res 1
|
||||
MultiLoopPassCntr: .res 1
|
||||
JumpspringForce: .res 1
|
||||
MaxRangeFromOrigin: .res 1
|
||||
BitMFilter: .res 1
|
||||
ChangeAreaTimer: .res 2
|
||||
SprShuffleAmtOffset: .res 1
|
||||
SprShuffleAmt: .res 3
|
||||
|
||||
SprDataOffset:
|
||||
Player_SprDataOffset: .res 1
|
||||
|
||||
Enemy_SprDataOffset: .res 7
|
||||
|
||||
Alt_SprDataOffset:
|
||||
Block_SprDataOffset: .res 2
|
||||
|
||||
Bubble_SprDataOffset: .res 3
|
||||
FBall_SprDataOffset: .res 2
|
||||
|
||||
Misc_SprDataOffset: .res 9
|
||||
|
||||
SavedJoypad1Bits:
|
||||
SavedJoypadBits: .res 1
|
||||
|
||||
SavedJoypad2Bits: .res 2
|
||||
Player_X_Scroll: .res 1
|
||||
Player_XSpeedAbsolute: .res 1
|
||||
FrictionAdderHigh: .res 1
|
||||
FrictionAdderLow: .res 1
|
||||
RunningSpeed: .res 1
|
||||
SwimmingFlag: .res 1
|
||||
Player_X_MoveForce: .res 1
|
||||
DiffToHaltJump: .res 1
|
||||
JumpOrigin_Y_HighPos: .res 1
|
||||
JumpOrigin_Y_Position: .res 1
|
||||
VerticalForce: .res 1
|
||||
VerticalForceDown: .res 1
|
||||
PlayerChangeSizeFlag: .res 1
|
||||
PlayerAnimTimerSet: .res 1
|
||||
PlayerAnimCtrl: .res 1
|
||||
JumpspringAnimCtrl: .res 1
|
||||
FlagpoleCollisionYPos: .res 1
|
||||
PlayerEntranceCtrl: .res 1
|
||||
FireballThrowingTimer: .res 1
|
||||
DeathMusicLoaded: .res 1
|
||||
FlagpoleSoundQueue: .res 1
|
||||
CrouchingFlag: .res 1
|
||||
GameTimerSetting: .res 1
|
||||
DisableCollisionDet: .res 1
|
||||
DemoAction: .res 1
|
||||
DemoActionTimer: .res 1
|
||||
PrimaryMsgCounter: .res 1
|
||||
|
||||
ScreenEdge_PageLoc:
|
||||
ScreenLeft_PageLoc: .res 1
|
||||
|
||||
ScreenRight_PageLoc: .res 1
|
||||
|
||||
ScreenEdge_X_Pos:
|
||||
ScreenLeft_X_Pos: .res 1
|
||||
|
||||
ScreenRight_X_Pos: .res 1
|
||||
ColumnSets: .res 1
|
||||
AreaParserTaskNum: .res 1
|
||||
CurrentNTAddr_High: .res 1
|
||||
CurrentNTAddr_Low: .res 1
|
||||
Sprite0HitDetectFlag: .res 1
|
||||
ScrollLock: .res 2
|
||||
CurrentPageLoc: .res 1
|
||||
CurrentColumnPos: .res 1
|
||||
TerrainControl: .res 1
|
||||
BackloadingFlag: .res 1
|
||||
BehindAreaParserFlag: .res 1
|
||||
AreaObjectPageLoc: .res 1
|
||||
AreaObjectPageSel: .res 1
|
||||
AreaDataOffset: .res 1
|
||||
AreaObjOffsetBuffer: .res 3
|
||||
AreaObjectLength: .res 3
|
||||
AreaStyle: .res 1
|
||||
StaircaseControl: .res 1
|
||||
AreaObjectHeight: .res 1
|
||||
MushroomLedgeHalfLen: .res 3
|
||||
EnemyDataOffset: .res 1
|
||||
EnemyObjectPageLoc: .res 1
|
||||
EnemyObjectPageSel: .res 1
|
||||
ScreenRoutineTask: .res 1
|
||||
ScrollThirtyTwo: .res 2
|
||||
HorizontalScroll: .res 1
|
||||
VerticalScroll: .res 1
|
||||
ForegroundScenery: .res 1
|
||||
BackgroundScenery: .res 1
|
||||
CloudTypeOverride: .res 1
|
||||
BackgroundColorCtrl: .res 1
|
||||
LoopCommand: .res 1
|
||||
StarFlagTaskControl: .res 1
|
||||
TimerControl: .res 1 ; 0747
|
||||
CoinTallyFor1Ups: .res 1
|
||||
SecondaryMsgCounter: .res 1
|
||||
JoypadBitMask: .res 4 ; .proc InitializeArea clears the 1st two bytes here and leaves below here alone
|
||||
|
||||
AreaType: .res 1 ; 074e
|
||||
|
||||
; notes:
|
||||
|
||||
; AreaType:
|
||||
; Water = 0
|
||||
; Ground = 1
|
||||
; UnderGround = 2
|
||||
; Castle = 3
|
||||
|
||||
AreaAddrsLOffset: .res 1
|
||||
AreaPointer: .res 1
|
||||
EntrancePage: .res 1
|
||||
AltEntranceControl: .res 1
|
||||
CurrentPlayer: .res 1 ; 0 = mario, 1 = luigi
|
||||
PlayerSize: .res 1 ; 1 = small, 0 = big
|
||||
Player_Pos_ForScroll: .res 1
|
||||
PlayerStatus: .res 1 ; 0 = small, 1 = super, 2 = firey
|
||||
FetchNewGameTimerFlag: .res 1
|
||||
JoypadOverride: .res 1
|
||||
GameTimerExpiredFlag: .res 1
|
||||
|
||||
OnscreenPlayerInfo:
|
||||
NumberofLives: .res 1
|
||||
|
||||
HalfwayPage: .res 1
|
||||
LevelNumber: .res 1
|
||||
Hidden1UpFlag: .res 1
|
||||
CoinTally: .res 1
|
||||
WorldNumber: .res 1
|
||||
AreaNumber: .res 1
|
||||
|
||||
OffscreenPlayerInfo:
|
||||
OffScr_NumberofLives: .res 1
|
||||
|
||||
OffScr_HalfwayPage: .res 1
|
||||
OffScr_LevelNumber: .res 1
|
||||
OffScr_Hidden1UpFlag: .res 1
|
||||
OffScr_CoinTally: .res 1
|
||||
OffScr_WorldNumber: .res 1
|
||||
OffScr_AreaNumber: .res 1
|
||||
ScrollFractional: .res 1
|
||||
DisableIntermediate: .res 1
|
||||
PrimaryHardMode: .res 1
|
||||
WorldSelectNumber: .res 5
|
||||
|
||||
; $0770: .proc InitializeGame leaves ram below here alone ( y = $6f )
|
||||
|
||||
OperMode: .res 2
|
||||
OperMode_Task: .res 1
|
||||
VRAM_Buffer_AddrCtrl: .res 1
|
||||
DisableScreenFlag: .res 1
|
||||
ScrollAmount: .res 1
|
||||
GamePauseStatus: .res 1
|
||||
GamePauseTimer: .res 1
|
||||
Mirror_PPU_CTRL: .res 1
|
||||
Mirror_PPU_MASK: .res 1
|
||||
NumberOfPlayers: .res 5
|
||||
IntervalTimerControl: .res 1
|
||||
|
||||
Timers:
|
||||
SelectTimer: .res 1
|
||||
PlayerAnimTimer: .res 1
|
||||
JumpSwimTimer: .res 1
|
||||
RunningTimer: .res 1
|
||||
BlockBounceTimer: .res 1
|
||||
SideCollisionTimer: .res 1
|
||||
JumpspringTimer: .res 1
|
||||
GameTimerCtrlTimer: .res 2
|
||||
ClimbSideTimer: .res 1
|
||||
EnemyFrameTimer: .res 5
|
||||
FrenzyEnemyTimer: .res 1
|
||||
BowserFireBreathTimer: .res 1
|
||||
StompTimer: .res 1
|
||||
AirBubbleTimer: .res 3 ; 20 bytes away from Timer
|
||||
|
||||
ScrollIntervalTimer: .res 1
|
||||
EnemyIntervalTimer: .res 7
|
||||
BrickCoinTimer: .res 1
|
||||
InjuryTimer: .res 1
|
||||
StarInvincibleTimer: .res 1
|
||||
ScreenTimer: .res 1
|
||||
WorldEndTimer: .res 1
|
||||
DemoTimer: .res 5
|
||||
PseudoRandomBitReg: .res 9
|
||||
|
||||
SoundMemory:
|
||||
MusicOffset_Noise: .res 1
|
||||
EventMusicBuffer: .res 1
|
||||
PauseSoundBuffer: .res 1
|
||||
Squ2_NoteLenBuffer: .res 1
|
||||
Squ2_NoteLenCounter: .res 1
|
||||
Squ2_EnvelopeDataCtrl: .res 1
|
||||
Squ1_NoteLenCounter: .res 1
|
||||
Squ1_EnvelopeDataCtrl: .res 1
|
||||
Tri_NoteLenBuffer: .res 1
|
||||
Tri_NoteLenCounter: .res 1
|
||||
Noise_BeatLenCounter: .res 1
|
||||
Squ1_SfxLenCounter: .res 2
|
||||
Squ2_SfxLenCounter: .res 1
|
||||
Sfx_SecondaryCounter: .res 1
|
||||
Noise_SfxLenCounter: .res 1
|
||||
DAC_Counter: .res 1
|
||||
NoiseDataLoopbackOfs: .res 3
|
||||
NoteLengthTblAdder: .res 1
|
||||
AreaMusicBuffer_Alt: .res 1
|
||||
|
||||
PauseModeFlag: .res 1
|
||||
GroundMusicHeaderOfs: .res 3
|
||||
AltRegContentFlag: .res 12
|
||||
|
||||
_WarmBootOffset: .res 1 ; Warm boot offset
|
||||
|
||||
TopScoreDisplay: ; : $07D7
|
||||
DisplayDigits: .res 6
|
||||
|
||||
PlayerScoreDisplay:
|
||||
ScoreAndCoinDisplay: .res 27
|
||||
|
||||
GameTimerDisplay: .res 4
|
||||
WorldSelectEnableFlag: .res 1
|
||||
|
||||
ContinueWorld: .res 1
|
||||
|
||||
_ColdBootOffset: .res 1 ; Cold boot offset, here and higher get nuked
|
||||
|
||||
WarmBootValidation: .res 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
37
src/nes.cfg
Normal file
37
src/nes.cfg
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
|
||||
MEMORY
|
||||
{
|
||||
ZP: start = $0, size = $100, type = rw;
|
||||
HEADER: start = 0, size = $0010, type = ro, file = %O, fill=yes, fillval=$00;
|
||||
STACK: start = $0100, size = $0100, type = rw;
|
||||
OAMRAM: start = $0200, size = $0100, type = rw;
|
||||
RAM: start = $0300, size = $0500, type = rw;
|
||||
ROM: start = $8000, size = $8000, type = ro, file = %O, fill=yes, fillval=$00;
|
||||
CHR: start = $0, size = $2000, type = ro, file = %O, fill=yes, fillval=$00;
|
||||
NDXDEBUG:
|
||||
start = 0,
|
||||
# 256 MB should be enough for everybody.
|
||||
size = $10000000,
|
||||
type = ro,
|
||||
file = "smb.nes.ndx";
|
||||
}
|
||||
|
||||
SEGMENTS {
|
||||
INESHDR: load = HEADER, type = ro;
|
||||
ZEROPAGE: load = ZP, type = zp;
|
||||
STACK: load = STACK, type = bss, define = yes, optional = yes;
|
||||
OAMRAM: load = OAMRAM, type = bss, define = yes, optional = yes;
|
||||
BSS: load = RAM, type = bss, define = yes;
|
||||
CODE: load = ROM, type = ro;
|
||||
RODATA: load = ROM, type = ro;
|
||||
VECTORS: load = ROM, type = ro, start = $FFFA;
|
||||
CHRROM: load = CHR, type = ro;
|
||||
NDXDEBUG:
|
||||
load = NDXDEBUG,
|
||||
type = ro,
|
||||
optional = yes;
|
||||
}
|
||||
|
||||
FILES {
|
||||
%O: format = bin;
|
||||
}
|
||||
149
src/nes_constants.h
Normal file
149
src/nes_constants.h
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
; ******************************************************************************
|
||||
; * ca65 NES_CONSTANTS.H
|
||||
|
||||
|
||||
|
||||
.ifndef _NES_CONSTANTS_H
|
||||
_NES_CONSTANTS_H = 1
|
||||
|
||||
; General NES constant values
|
||||
|
||||
PPU_CTRL = $2000
|
||||
PPU_MASK = $2001
|
||||
PPU_STATUS = $2002
|
||||
PPU_ADDRESS = $2006
|
||||
PPU_DATA = $2007
|
||||
OAM_ADDRESS = $2003
|
||||
OAM_DATA = $2004
|
||||
OAM_DMA = $4014
|
||||
PPU_SCROLL = $2005
|
||||
|
||||
; ******************************************************************************
|
||||
; * FLAGS/MASKS
|
||||
; ******************************************************************************/
|
||||
|
||||
; For ppu_ctrl
|
||||
|
||||
CT_NMI = %10000000
|
||||
CT_PPUSLAVE = %01000000
|
||||
CT_SPRITE8x16 = %00100000
|
||||
CT_BACKADDR1000 = %00010000
|
||||
CT_SPRADDR1000 = %00001000
|
||||
CT_ADDRINC32 = %00000100
|
||||
CT_NAMETABLE2000 = %00000000
|
||||
CT_NAMETABLE2400 = %00000001
|
||||
CT_NAMETABLE2800 = %00000010
|
||||
CT_NAMETABLE2C00 = %00000011
|
||||
|
||||
|
||||
; For ppu_mask
|
||||
|
||||
MA_PALETTE_BLUE = %10000000
|
||||
MA_PALETTE_GREEN = %01000000
|
||||
MA_PALETTE_RED = %00100000
|
||||
MA_SPRITESVISIBLE = %00010000
|
||||
MA_BACKVISIBLE = %00001000
|
||||
MA_SPRNOCLIP = %00000100
|
||||
MA_BACKNOCLIP = %00000010
|
||||
MA_MONOCHROME = %00000001
|
||||
|
||||
; status flags ppu_status
|
||||
|
||||
ST_VBLANK = %10000000
|
||||
ST_SPRITE0 = %01000000
|
||||
ST_SCANSPROVERFLOW = %00100000
|
||||
ST_VRAM_NOWRITE = %00010000
|
||||
|
||||
; sprites
|
||||
|
||||
OAM_TOTAL = 64
|
||||
OAM_SIZE = (4*OAM_TOTAL)
|
||||
|
||||
; palette
|
||||
|
||||
PAL_ADDRESS = $3F00
|
||||
PAL_0_ADDRESS = $3F00
|
||||
PAL_1_ADDRESS = $3F04
|
||||
PAL_2_ADDRESS = $3F08
|
||||
PAL_3_ADDRESS = $3F0C
|
||||
PAL_0_SPR_ADDRESS = $3F10
|
||||
PAL_1_SPR_ADDRESS = $3F14
|
||||
PAL_2_SPR_ADDRESS = $3F18
|
||||
PAL_3_SPR_ADDRESS = $3F1C
|
||||
|
||||
PAL_0 = $3F00
|
||||
PAL_1 = $3F04
|
||||
PAL_2 = $3F08
|
||||
PAL_3 = $3F0C
|
||||
PAL_4 = $3F10
|
||||
PAL_5 = $3F14
|
||||
PAL_6 = $3F18
|
||||
PAL_7 = $3F1C
|
||||
|
||||
|
||||
; $3F01-$3F03 Background palette 0
|
||||
; $3F05-$3F07 Background palette 1
|
||||
; $3F09-$3F0B Background palette 2
|
||||
; $3F0D-$3F0F Background palette 3
|
||||
; $3F11-$3F13 Sprite palette 0
|
||||
; $3F15-$3F17 Sprite palette 1
|
||||
; $3F19-$3F1B Sprite palette 2
|
||||
; $3F1D-$3F1F Sprite palette 3
|
||||
|
||||
|
||||
; CHR
|
||||
|
||||
PATTERN_TABLE_0_ADDRESS = $0000
|
||||
PATTERN_TABLE_1_ADDRESS = $1000
|
||||
|
||||
; NAME TABLE
|
||||
NAMETABLE_WIDTH = 32
|
||||
NAMETABLE_HEIGHT = 30
|
||||
SCREEN_WIDTH = 256
|
||||
SCREEN_HEIGHT = 240
|
||||
|
||||
NAME_TABLE_0_ADDRESS = $2000
|
||||
NAME_TABLE_SIZE = $03C0
|
||||
ATTRIBUTE_TABLE_0_ADDRESS = $23C0
|
||||
ATTRIBUTE_TABLE_SIZE = $0040
|
||||
NAME_TABLE_1_ADDRESS = $2400
|
||||
ATTRIBUTE_TABLE_1_ADDRESS = $27C0
|
||||
NAME_TABLE_2_ADDRESS = $2800
|
||||
ATTRIBUTE_TABLE_2_ADDRESS = $2BC0
|
||||
NAME_TABLE_3_ADDRESS = $2C00
|
||||
ATTRIBUTE_TABLE_3_ADDRESS = $2FC0
|
||||
|
||||
; **********************************************************************
|
||||
; Joystick
|
||||
; **********************************************************************
|
||||
|
||||
PAD0 = $4016
|
||||
PAD1 = $4017
|
||||
JOYPAD_PORT = $4016
|
||||
JOYPAD_PORT2 = $4017
|
||||
|
||||
; joypad masks
|
||||
|
||||
BUTTON_A = %10000000
|
||||
BUTTON_B = %01000000
|
||||
BUTTON_SELECT = %00100000
|
||||
BUTTON_START = %00010000
|
||||
BUTTON_UP = %00001000
|
||||
BUTTON_DOWN = %00000100
|
||||
BUTTON_LEFT = %00000010
|
||||
BUTTON_RIGHT = %00000001
|
||||
|
||||
; **********************************************************************
|
||||
; Sound
|
||||
; **********************************************************************
|
||||
|
||||
SND_REGISTER = $4000
|
||||
SND_SQUARE1_REG = $4000
|
||||
SND_SQUARE2_REG = $4004
|
||||
SND_TRIANGLE_REG = $4008
|
||||
SND_NOISE_REG = $400c
|
||||
SND_DELTA_REG = $4010
|
||||
SND_MASTERCTRL_REG = $4015
|
||||
|
||||
|
||||
.endif
|
||||
67
src/smbdis.h
Normal file
67
src/smbdis.h
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
;
|
||||
; This file contains macros designed to be used as a part of the
|
||||
; smb HL disassembly.
|
||||
;
|
||||
|
||||
; ----------------------------------------------------------------------------
|
||||
|
||||
; change to USEDATASEG = 1 to move data blocks to their own segment, rather than mixed with code
|
||||
; ( leave 0 to match original ROM )
|
||||
|
||||
USEDATASEG = 0
|
||||
|
||||
; ----------------------------------------------------------------------------
|
||||
|
||||
.autoimport + ; don't declare symbols to be imported
|
||||
.linecont + ; allow a '\' to indicate the line is to be continued.
|
||||
|
||||
; ----------------------------------------------------------------------------
|
||||
|
||||
; macro vram_string:
|
||||
; ( xx, yy ) = (x,y) location on screen, str = string to display
|
||||
; This macro will convert the parameters into data acceptable to smb's
|
||||
; vram writing routine.
|
||||
|
||||
; This works, but wasn't implemented except for a couple tests
|
||||
|
||||
.macro vram_string xx,yy,str
|
||||
.byte >($2000 + (yy * $20 + xx)), <($2000 + (yy * $20 + xx)), .strlen(str), str
|
||||
.endmacro
|
||||
|
||||
; ----------------------------------------------------------------------------
|
||||
|
||||
; mark a block as data ( SEE USEDATASEG above )
|
||||
|
||||
.macro dataseg
|
||||
.if ::USEDATASEG
|
||||
.segment "RODATA"
|
||||
.endif
|
||||
.endmacro
|
||||
|
||||
; ----------------------------------------------------------------------------
|
||||
|
||||
; output a bit opcode byte
|
||||
|
||||
.macro BIT_Skip2
|
||||
.byte $2c
|
||||
.endmacro
|
||||
|
||||
; ----------------------------------------------------------------------------
|
||||
|
||||
; call this macro once to setup character set encoding used by smb
|
||||
|
||||
.macro customchars
|
||||
|
||||
.define CHARS "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
.repeat .strlen(CHARS), I
|
||||
.charmap .strat(CHARS, I), I
|
||||
.endrepeat
|
||||
.undefine CHARS
|
||||
|
||||
.charmap '-', $28
|
||||
.charmap 'x', $29
|
||||
.charmap '!', $2b
|
||||
.charmap ' ', $24
|
||||
.charmap '.', $af
|
||||
|
||||
.endmacro
|
||||
17555
src/smbdishl.s
Normal file
17555
src/smbdishl.s
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue