.6502 .INCLUDE "MARIA2.S" .INCLUDE "GAMEQU.S" .INCLUDE "PAGEZERO.S" .INCLUDE "RAMAREA.S" .INCLUDE "ROMAREA.S" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; MAIN PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START COMMANDO ; place for IRQ and NMI to attach dummy: rti main: sei cld ldx #$FF ;init stack txs lda #$7 sta PTCTRL inx loop: ;move display list list to RAM lda ROMCODE,x sta RAM3,x lda ROMCODE+$100,x sta RAM3+$100,x inx bne loop main30: bit MSTAT ;Vblank? bmi main30 main32: bit MSTAT ;Vblank? bpl main32 SCREEN 0,2,0,1,0,2 ;0=normal color. ;2=Normal DMA. ;0=single byte wide characters. ;1=background colored border. ;0=transparency mode. ;3=320 a or c mode. ; DO CODE INITIALIZATION LDA #$0 STA LINEOFF STA FRAME STA CASENUM LDA #$00 STA BKGRND LDA #$06 STA P0C1 LDA #$20 STA P0C2 LDA #$D4 STA P0C3 ; TRANSFER MAP VALUES FROM ROM TO RAM LDX #MAPMAX MAPLOOP: LDA RMAPHPOS,X STA MAPHPOS,X LDA RMAPVLSB,X STA MAPVLSB,X LDA RMAPVMSB,X STA MAPVMSB,X DEX BPL MAPLOOP ; REPEAT - WAIT UNTIL VBLANK MAIN40: bit MSTAT ;Vblank? bmi MAIN40 MAIN50: bit MSTAT ;Vblank? bpl MAIN50 LDA #$00 STA BKGRND ; IF CASENUM = 0 LDA CASENUM CMP #0 BNE MAIN60 ; DLL=DLLIST0 ; ZONEVEC=ZONES0 DPPLOAD DLLIST1 LDA #ZONES0 & $FF STA ZONEVEC LDA #ZONES0 >> 8 STA ZONEVEC+1 JMP MAIN70 ; ELSE DLL=DLLIST1 ; ZONEVEC=ZONES1 MAIN60: DPPLOAD DLLIST0 LDA #ZONES1 & $FF STA ZONEVEC LDA #ZONES1 >> 8 STA ZONEVEC+1 ; ENDIF ; ZONEPTR'S = ZONEBASES MAIN70: LDY #23 ZLOOP: LDA (ZONEVEC),Y STA ZONEPTR,Y DEY LDA (ZONEVEC),Y STA ZONEPTR,Y DEY BPL ZLOOP ; DO TERRAIN JSR TERRAIN ; INCREMENT FRAME INC FRAME ; TERMINATE HEADER ZONES LDX #23 Z2LOOP: LDA ZONEPTR,X STA TPTR1+1 DEX LDA ZONEPTR,X STA TPTR1 LDA #0 LDY #0 STA (TPTR1),Y INY STA (TPTR1),Y DEX BPL Z2LOOP ; IF CASENUM=0 LDA CASENUM CMP #0 BNE MAIN80 ; CASENUM=1 LDA #1 STA CASENUM JMP MAIN90 ; ELSE CASENUM=0 MAIN80: LDA #0 STA CASENUM ; ENDIF MAIN90: LDA #$22 STA BKGRND ; UNTIL FOREVER JMP MAIN40 ; END COMMANDDO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START TERRAIN ; MAPNUM=#MAPMAX TERRAIN: LDA #MAPMAX STA MAPNUM ; REPEAT ; IF OBJECT VISIBLE TLOOP: JSR VISCHK BEQ TERR10 ; DRAW OBJECT JSR DRAW ; ENDIF ; DO SCROLL TERR10: ; JSR SCROLL ; DECREMENT MAPNUM DEC MAPNUM ; UNTIL MAPNUM < 0 BPL TLOOP ; END TERRAIN RTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START DRAW ; VZONE=VPOS/16 ; VOFF=REMAINDER DRAW: LDX MAPNUM LDA MAPVLSB,X AND #$0F STA VOFF LDA MAPVLSB,X LSR LSR LSR LSR STA VZONE ; OBJNUM=MAPOBJ LDX MAPNUM LDA MAPOBJ,X STA OBJNUM ; OBJADR=OBJPTR ASL TAY LDA OBJPTR,Y STA OBJADR INY LDA OBJPTR,Y STA OBJADR+1 ; TCOLOR=OBJCOLOR*32 LDX OBJNUM LDA OBJCOLOR,X ASL ASL ASL ASL ASL STA TCOLOR ; TWIDTH=$1F-OBJHSIZE SEC LDA #$1F SBC OBJHSIZE,X STA TWIDTH ; COLORWTH=TCOLOR OR TWIDTH LDA TCOLOR ORA TWIDTH STA COLORWTH ; OBJVCNT=OBJVSIZE-OBJVINIT SEC LDA OBJVSIZE,X SBC OBJVINIT STA OBJVCNT ; OBJVPART=OBJVSIZE-OBJVCNT SEC LDA OBJVSIZE,X SBC OBJVCNT STA OBJVPART ; IF ?OFFBOT SET LDA ?OFFBOT BEQ DRAW35 ; INCREMENT OBJVINIT LDA OBJVTMP STA OBJVCNT ; IF VOFF=0 LDA VOFF BNE DRAW35 ; DECREMENT OBJVCNT DEC OBJVCNT ; ENDIF ; ENDIF ; HPOS=MAPHPOS DRAW35: LDX MAPNUM LDA MAPHPOS,X STA HPOS ; IF VOFF=0 LDA VOFF BNE DRAW30 ; IF ?OFFTOP SET LDA ?OFFTOP BEQ DRAW30 ; DECREMENT OBJVCNT INC VNDXCNT ; ENDIF ; VNDX=VZONE+OBJVPART DRAW30: CLC LDA VZONE ADC VNDXCNT STA VNDX ; REPEAT ; IF VOFF=0 DLOOP: LDA VOFF BNE DRAW10 ; LOADR=OBJDEF LO ; HIADR=OBJDEF HI LDA OBJVPART ASL TAY LDA (OBJADR),Y STA LOADR INY LDA (OBJADR),Y STA HIADR ; DO HEADER ; TRANSFER HEADER LDA VNDX ASL TAX LDA ZONEPTR,X STA ZONETMP INX LDA ZONEPTR,X STA ZONETMP+1 LDY #3 HEAD30: LDA LOADR,Y STA (ZONETMP),Y DEY BPL HEAD30 ; UPDATE ZONEPTR DEX CLC LDA ZONEPTR,X ADC #04 STA ZONEPTR,X ; INCREMENT VNDXCNT INC VNDX JMP DRAW20 ; ELSE CALCADR DRAW10: JMP CALCADR ; ENDIF ; INCREMENT OBJVPART DRAW20: INC OBJVPART ; DECREMENT OBJVCNT DEC OBJVCNT ; UNTIL OBJVCNT < 0 BPL DLOOP ; RESTORE MAPVLSB LDA SAVEVLSB LDY MAPNUM STA MAPVLSB,Y ; END DRAW RTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START CALCADR ; OBJBASE=OBJDEF CALCADR: LDA OBJVPART ASL TAY LDA (OBJADR),Y STA LOADR INY LDA (OBJADR),Y STA OBJBASE+1 ; IF ?OFFTOP CLEAR LDA ?OFFTOP BNE CALC10 ; LINEOFF=VOFF*256 LDA VOFF STA LINEOFF+1 ; LOADR=(OBJBASE+LINEOFF) LO ; HIADR=(OBJBASE+LINEOFF) HI CLC LDA OBJBASE+1 ADC LINEOFF+1 STA HIADR ; DO HEADER ; TRANSFER HEADER LDA VNDX ASL TAX LDA ZONEPTR,X STA ZONETMP INX LDA ZONEPTR,X STA ZONETMP+1 LDY #3 HEAD20: LDA LOADR,Y STA (ZONETMP),Y DEY BPL HEAD20 ; UPDATE ZONEPTR DEX CLC LDA ZONEPTR,X ADC #04 STA ZONEPTR,X JMP CALC20 ; ELSE CLEAR ?OFFTOP CALC10: LDA #0 STA ?OFFTOP ; ENDIF ; VNDXCNT=VNDXCNT+1 CALC20: INC VNDX ; IF OBJVCNT=0 LDA OBJVCNT BNE CALC25 ; IF ?OFFBOT CLEAR LDA ?OFFBOT BNE CALC30 ; LINEOFF=(16-VOFF)*256 CALC25: SEC LDA #16 SBC VOFF STA LINEOFF+1 ; LOADR=(OBJBASE-LINEOFF) LO ; HIADR=(OBJBASE-LINEOFF) HI SEC LDA OBJBASE+1 SBC LINEOFF+1 STA HIADR ; DO HEADER ; TRANSFER HEADER LDA VNDX ASL TAX LDA ZONEPTR,X STA ZONETMP INX LDA ZONEPTR,X STA ZONETMP+1 LDY #3 HEAD10: LDA LOADR,Y STA (ZONETMP),Y DEY BPL HEAD10 ; UPDATE ZONEPTR DEX CLC LDA ZONEPTR,X ADC #04 STA ZONEPTR,X ; ENDIF ; END CALCADR CALC30: JMP DRAW20 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START ; IF MAPVMSB=$FF VISCHK: LDX MAPNUM LDA MAPVMSB,X CMP #$FF BNE VIS10 ; VLINES=OBJVSIZE*16 ; VLINES=VLINES-1 LDY MAPOBJ,X STY OBJNUM CLC LDA OBJVSIZE,Y ADC #1 ASL ASL ASL ASL STA VLINES ; DEC VLINES ; INVISVAL=191-MAPVLSB SEC LDA #192 SBC MAPVLSB,X STA INVISVAL ; IF INVISVAL < VLIINES (OFF TOP) CMP VLINES BCS VIS40 ; OBJVINIT=INVISVAL/16 ; SAVEVLSB=MAPVLSB ; MAPVLSB=REMAINDER ; SET ?OFFTOP ; CLEAR ?OFFBOT ; VNDXCNT=FF ; ACC=TRUE LDA MAPVLSB,X STA SAVEVLSB AND #$0F STA MAPVLSB,X LDA INVISVAL LSR LSR LSR LSR STA OBJVINIT LDA #0 STA ?OFFBOT LDA #$FF STA ?OFFTOP STA VNDXCNT JMP VIS20 ; ELSE VIS40: LDA #0 ; ENDIF JMP VIS20 ; ELSEIF MAPVMSB=0 VIS10: LDA MAPVMSB,X CMP #0 BNE VIS30 ; VLINES=OBJVSIZE*16 ; VLINES=VLINES-1 LDY MAPOBJ,X STY OBJNUM CLC LDA OBJVSIZE,Y ADC #1 ASL ASL ASL ASL STA VLINES ; DEC VLINES ; INVISVAL=191-MAPVLSB SEC LDA #192 SBC MAPVLSB,X STA INVISVAL ; IF INVISVAL < VLIINES (OFF BOTTOM) CMP VLINES BCS VIS42 ; OBJVINIT=OBJVSIZE-(INVISVAL/16) ; SAVEVLSB=MAPVLSB ; SET ?OFFTBOT ; CLEAR ?OFFTOP ; VNDXCNT=0 ; ACC=TRUE LDA MAPVLSB,X STA SAVEVLSB LDA INVISVAL LSR LSR LSR LSR STA OBJVTMP ; SEC ; LDA OBJVSIZE,Y ; SBC OBJVINIT ; STA OBJVINIT LDA #0 STA OBJVINIT STA ?OFFBOT STA VNDXCNT LDA #$FF STA ?OFFBOT JMP VIS20 ; ELSE DO FULL OBJECT ; OBJVINIT=0 ; CLEAR ?OFFTOP ; CLEAR ?OFFBOT ; VNDXCNT=0 ; SAVEVLSB=MAPVLSB ; ACC=TRUE VIS42: LDA #0 STA ?OFFTOP STA ?OFFBOT STA VNDXCNT STA OBJVINIT LDA MAPVLSB,X STA SAVEVLSB LDA #$FF JMP VIS20 ; ELSE ACC=FALSE VIS30: LDA #0 ; ENDIF ; END VISCHK VIS20: RTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; START SCROLL SCROLL: LDA FRAME AND #$03 BNE SCROLL10 LDX MAPNUM INC MAPVLSB,X ; INC MAPHPOS,X LDA MAPVLSB,X CMP #192 BNE SCROLL10 INC MAPVMSB,X ; LDA MAPVMSB,X ; CMP #0 ; BNE SCROLL10 ; LDA MAPVLSB,X ; CMP #150 ; BNE SCROLL10 ; LDA MAPVMSB,X ; CMP #1 ; BNE SCROLL20 ; LDA #$FF ; STA MAPVMSB,X SCROLL20: LDA #0 STA MAPVLSB,X SCROLL10: RTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; SET INTERRUPT VECTORS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .org $FFF8 .dc.w $F7FF .dc.w dummy ;NMI .dc.w main ;RESET .dc.w dummy ;IRQ