add loader
This commit is contained in:
306
snes/loader/main.asm
Normal file
306
snes/loader/main.asm
Normal file
@@ -0,0 +1,306 @@
|
||||
.MEMORYMAP
|
||||
DEFAULTSLOT 0
|
||||
SLOTSIZE $10000
|
||||
SLOT 0 $0000
|
||||
.ENDME
|
||||
|
||||
|
||||
.ROMBANKSIZE $10000 ; Every ROM bank is 64 KBytes in size, also necessary.
|
||||
.HIROM
|
||||
.ROMBANKS 4
|
||||
|
||||
.DEFINE HEADER_OFF $8000
|
||||
.COMPUTESNESCHECKSUM
|
||||
.EMPTYFILL $ff
|
||||
|
||||
.include "routines/variables.asm"
|
||||
.include "routines/defines.asm"
|
||||
|
||||
|
||||
;***********************************************************************************
|
||||
; setup header
|
||||
;***********************************************************************************
|
||||
.define BaseAdress $c00000
|
||||
|
||||
|
||||
;includes with superfree sections go here:
|
||||
.include "routines/miscdata.asm"
|
||||
.include "routines/bgmodes.asm"
|
||||
; .include "routines/battlefiles.asm"
|
||||
; .include "routines/battlezscrolllists.asm"
|
||||
; .include "routines/battlezscrolllut.asm"
|
||||
; .include "routines/introscene3scrolltable.asm"
|
||||
.include "routines/oamvectoranglelut.asm"
|
||||
.include "routines/oamobjects.asm"
|
||||
.include "routines/oamanimationlists.asm"
|
||||
; .include "routines/hdmatables.asm"
|
||||
.include "routines/menufiles.asm"
|
||||
.include "routines/textstrings.asm"
|
||||
.include "routines/spritedata.asm"
|
||||
.include "routines/songs.asm"
|
||||
.include "routines/samplepacks.asm"
|
||||
.include "routines/backgroundfiles.asm"
|
||||
; .include "routines/videoframes.asm"
|
||||
|
||||
;includes with fixed sections go here:
|
||||
.include "routines/audiostreams.asm"
|
||||
; .include "routines/levelfiles.asm"
|
||||
|
||||
.BANK 0 SLOT 0 ; The SLOT 0 may be ommitted, as SLOT 0 is the DEFAULTSLOT
|
||||
; === Cartridge Header - part 1 - =====================
|
||||
.ORG $7FC0 + HEADER_OFF
|
||||
.DB "OPTIXX TESTROM " ; Title (can't be more than 21 bytes, and should probably be a full 21 bytes)
|
||||
|
||||
; "123456789012345678901"
|
||||
.ORG $7FD5 + HEADER_OFF
|
||||
.DB $31 ; Memory Mode ( $20 = Slow LoRom, $21 = Slow HiRom )
|
||||
|
||||
.BANK 0 SLOT 0
|
||||
; === Cartridge Header - part 2 - =====================
|
||||
.ORG $7FD6 + HEADER_OFF
|
||||
.DB $00 ; Contents ( $00 = ROM only, $01 = ROM and RAM, $02 = ROM and Save RAM)
|
||||
.DB $08 ; ROM Size ( $08 = 2 Mbit, $09 = 4 Mbit, $0A = 8Mbit, $0B = 16Mbit c=32, d=64... etc )
|
||||
.DB $00 ; SRAM Size ( $00 = 0 bits, $01 = 16 kbits, $02 = 32 kbits, $03 = 64 kbits )
|
||||
.DB $01 ; Country ( $01 = USA )
|
||||
.DB $33 ; Licensee Code
|
||||
.DB $01 ; Version
|
||||
.dw $0 ;checksum
|
||||
.dw $ffff ;checksum xor. this must be filled out here, else wla dx thinks its free space, places something there and overwrites it with the checksum later.
|
||||
|
||||
.BANK 0 SLOT 0
|
||||
; === Interrupt Vector Table ====================
|
||||
.ORG $7FE4 + HEADER_OFF ; === Native Mode ===
|
||||
.DW EmptyHandler ; COP
|
||||
.DW EmptyHandler ; BRK
|
||||
.DW EmptyHandler ; ABORT
|
||||
.DW NmiHookUp ; NMI
|
||||
.DW $0000 ; (Unused)
|
||||
.DW IrqHookUp ; IRQ
|
||||
|
||||
.ORG $7FF4 + HEADER_OFF ; === Emulation Mode ===
|
||||
.DW EmptyHandler ; COP
|
||||
.DW $0000 ; (Unused)
|
||||
.DW EmptyHandler ; ABORT
|
||||
.DW EmptyHandler ; NMI
|
||||
.DW Boot ; RESET
|
||||
.DW EmptyHandler ; IRQ/BRK
|
||||
|
||||
; ============================================
|
||||
|
||||
|
||||
|
||||
|
||||
.bank 0 slot 0
|
||||
.org $ffa0
|
||||
EmptyHandler:
|
||||
rti
|
||||
|
||||
Boot:
|
||||
SEI
|
||||
CLC
|
||||
XCE
|
||||
PHK
|
||||
PLB
|
||||
REP #$30
|
||||
SEP #$20
|
||||
STZ $4200 ;reg $4200 - disable timers, NMI,and auto-joyread
|
||||
lda #%00000001
|
||||
sta $420d ;set memory mode to fastrom
|
||||
jml (HiromStart+BaseAdress) ;lorom
|
||||
|
||||
NmiHookUp:
|
||||
rti
|
||||
IrqHookUp:
|
||||
jml (IrqLoader+BaseAdress)
|
||||
|
||||
|
||||
|
||||
.bank 0 slot 0
|
||||
.org $0
|
||||
.Section "Main Code"
|
||||
;functions to include go here:
|
||||
.include "routines/printstring.asm"
|
||||
.include "routines/menusystem.asm"
|
||||
.include "routines/gfxvrammisc.asm"
|
||||
.include "routines/vblanknmi.asm"
|
||||
; .include "routines/levelloader.asm"
|
||||
; .include "routines/bgscrolling.asm"
|
||||
.include "routines/dmafifo.asm"
|
||||
.include "routines/irq.asm"
|
||||
.include "routines/oammanager.asm"
|
||||
.include "routines/oamsubroutines.asm"
|
||||
; .include "routines/collisiondetection.asm"
|
||||
.include "routines/randomnumbergen.asm"
|
||||
; .include "routines/hdmahandler.asm"
|
||||
; .include "routines/hdmasubroutines.asm"
|
||||
.include "routines/spcinterface.asm"
|
||||
.include "routines/menusubroutines.asm"
|
||||
; .include "routines/videoplayer.asm"
|
||||
.include "routines/memoryclear.asm"
|
||||
.include "routines/eventroutines.asm"
|
||||
.include "routines/joypadread.asm"
|
||||
|
||||
|
||||
HiromStart:
|
||||
sep #$20
|
||||
LDA #$80
|
||||
STA $2100 ;turn screen off for now, zero brightness
|
||||
|
||||
rep #$31
|
||||
lda.w #$0000
|
||||
tcd
|
||||
|
||||
lda.w #$01ff
|
||||
tcs
|
||||
|
||||
sep #$20
|
||||
lda.b #0 ;clear word: $0000
|
||||
ldy.w #$1f0
|
||||
ldx.w #0
|
||||
jsr ClearWRAM
|
||||
|
||||
lda.b #0 ;clear word: $0000
|
||||
ldy.w #$6000
|
||||
ldx.w #$200
|
||||
jsr ClearWRAM
|
||||
|
||||
LDX #$2101
|
||||
|
||||
MemClearLoop1: ;regs $2101-$210C
|
||||
STZ $00,X ;set Sprite,Character,Tile sizes to lowest, and set addresses to $0000
|
||||
INX
|
||||
CPX #$210D
|
||||
BNE MemClearLoop1
|
||||
|
||||
MemClearLoop2: ;regs $210D-$2114
|
||||
STZ $00,X ;Set all BG scroll values to $0000
|
||||
STZ $00,X
|
||||
INX
|
||||
CPX #$2115
|
||||
BNE MemClearLoop2
|
||||
|
||||
LDA #$80 ;reg $2115
|
||||
STA $2115 ; Initialize VRAM transfer mode to word-access, increment by 1
|
||||
STZ $2116 ;regs $2117-$2117
|
||||
STZ $2117 ;VRAM address = $0000
|
||||
STZ $211A ;clear Mode7 setting
|
||||
LDX #$211B
|
||||
|
||||
MemClearLoop3: ;regs $211B-$2120
|
||||
STZ $00,X ;clear out the Mode7 matrix values
|
||||
STZ $00,X
|
||||
INX
|
||||
CPX #$2121
|
||||
BNE MemClearLoop3
|
||||
LDX #$2123
|
||||
|
||||
MemClearLoop4: ;regs $2123-$2133
|
||||
STZ $00,X ;turn off windows, main screens, sub screens, color addition,
|
||||
INX ;fixed color = $00, no super-impose (external synchronization),
|
||||
CPX #$2134 ;no interlaced mode, normal resolution
|
||||
BNE MemClearLoop4
|
||||
|
||||
LDA #$FF
|
||||
STA $4201 ;reg $4201 - programmable I/O write port, initalize to allow reading at in-port
|
||||
nop
|
||||
nop
|
||||
LDA $4210 ;reg $4210 - NMI status, reading resets
|
||||
lda $4211 ;irq status reset
|
||||
|
||||
;clear all graphics buffers:
|
||||
jsr ClearPalette ;Reset colors
|
||||
jsr ClearPaletteBuffer
|
||||
jsr ClearBg1TilemapBuffer
|
||||
jsr ClearBg2TilemapBuffer
|
||||
jsr InitDmaFifo
|
||||
jsr InitOam
|
||||
jsr ClearColObjList
|
||||
jsr ClearZBuffer
|
||||
;init variables:
|
||||
rep #$31
|
||||
lda.w #$1234 ;seed RNG
|
||||
sta.b R1
|
||||
lda.w #$55aa
|
||||
sta.b R2
|
||||
|
||||
sep #$20
|
||||
lda #%00000001 ;enable screen, auto joypad
|
||||
sta.w InterruptEnableFlags
|
||||
sta.w $4200
|
||||
lda.w SetIni ;set display mode
|
||||
sta.w $2133 ;dont set this during nmi cause if the overscan flag is changed mid-nmi, it might result in screw ups with the nmi timing
|
||||
cli
|
||||
jsr EnableScreen
|
||||
/*
|
||||
;main loop starts here:
|
||||
CheckNextFrame:
|
||||
ldx.w FrameCounterLo ;load current frame counter
|
||||
cpx.w LastFrameLo ;load last frame processed
|
||||
beq CheckNextFrame ;check until one frame advances
|
||||
stx.w LastFrameLo
|
||||
*/
|
||||
|
||||
;main loop starts here:
|
||||
CheckNextFrame:
|
||||
|
||||
lda.w $4210 ;wait until out of nmi
|
||||
bmi CheckNextFrame
|
||||
|
||||
CheckNextNMI:
|
||||
lda.w $4210 ;wait until in nmi
|
||||
bpl CheckNextNMI
|
||||
|
||||
jsr NMI
|
||||
|
||||
lda CurrentEvent ;load number of currently active scene
|
||||
asl ;multiply number by 2
|
||||
rep #$31 ;set accu to 16bit
|
||||
and.w #$00ff ;only use low byte
|
||||
tax ;transfer to x
|
||||
|
||||
sep #$20 ;reset accu to 8bit
|
||||
lda.w SetIni ;set display mode
|
||||
sta.l $2133 ;dont set this during nmi cause if the overscan flag is changed mid-nmi, it might result in screw ups with the nmi timing
|
||||
|
||||
|
||||
php
|
||||
jsr (EventPtTable,x) ;and jump to the location found at pointertable where x is the pointernumber
|
||||
plp
|
||||
lda.b #$80
|
||||
sta.l $4201
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
lda.l $2137
|
||||
lda.l $213f ;reset $213d to low byte
|
||||
lda.l $213d ;get current scanline
|
||||
sta.w CpuUsageScanline
|
||||
bra CheckNextFrame
|
||||
|
||||
|
||||
.ends
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user