123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- .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 ROMToWRAM
- jml (go+$7f0000)
- go:
- jsr EnableScreen
- jsr SpcPlaySong
- /*
- ;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
|