307 lines
7.5 KiB
NASM
307 lines
7.5 KiB
NASM
.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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|