All pastes #349083 Raw Edit

NF-ball

public text v1 · immutable
·published 2007-02-10 15:31 UTC
rendered paste body
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Ping Pong 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	; INES header
	.inesprg 1
	.ineschr 1
	.inesmir 1
	.inesmap 0

	; Grafikkbank
	.bank 2
	.org $0000
	.incbin "back.chr"
	.incbin "spr.chr"

	; CPU interrupt-tabell
	.bank 1
	.org $FFFA
	.dw NMI,Start,IRQ
	
	; CPU hovedbank
	.bank 0
	.org $0000

	; Her har vi variabeldefinisjonene
	PrintLav: 	.db 0
	PrintHoy:	.db 0
	TekstDeskLav:	.db 0
	TekstDeskHoy:	.db 0
	PalettLav:	.db 0
	PalettHoy:	.db 0
	AttributtLav:	.db 0
	AttributtHoy:	.db 0
	BaneLav:	.db 0
	BaneHoy:	.db 0
	GLav:		.db 0
	GHoy:		.db 0
	
	Nametable:	.db 0

	tpal:		.db 0
	tpalflag:	.db 0
	bildeteller:	.db 0
	vblstatus:	.db 0
	modus:		.db 0

	scrollx:	.db 0
	scrolln:	.db 0
	ScrollInk:	.db 0
	
	XVal:		.db 0
	YVal:		.db 0
	Xret:		.db 0
	Yret:		.db 0
	
	SpillType:	.db 0
	VinnStatus:	.db 0
	P1S1:		.db 0
	P1S2:		.db 0
	P2S1:		.db 0
	P2S2:		.db 0
	BgNummer:	.db 0
	FNTeller:	.db 0

	.org $0200
	
	PrintBuffer:	.db 0
	
	.org $0304
	BallY:		.db 0
			.db 0
			.db 0
	BallX:		.db 0

	Pad1_YO:	.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X

			.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X

	Pad1_YM:	.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X
			
			.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X
	
	Pad1_YN:	.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X
			
			.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X
	
	Pad2_YO:	.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X

			.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X

	Pad2_YM:	.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X
			
			.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X
	
	Pad2_YN:	.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X
			
			.db 0 ; Y
			.db 0 ; T
			.db 0 ; A
			.db 0 ; X

			.db 0
	P1S2_T:		.db 0
			.db 0
			.db 0
			.db 0
	P1S1_T:		.db 0
			.db 0
			.db 0
			.db 0
	P2S2_T:		.db 0
			.db 0
			.db 0
			.db 0
	P2S1_T:		.db 0

	; Koden starter i $8000
	.org $8000
Start:
	; Slå av interrupts og fjern decimal mode flagget
	sei
	cld

	; Vi venter to VBLANKer før vi gjør noe som helst med PPU
.wvb1	lda $2002
	bpl .wvb1
.wvb2	lda $2002
	bpl .wvb2

	; Vi slår av PPU slik at vi kan modifisere VRAM	uten å fucke opp
	lda #0
	sta $2000
	sta $2001

	; Fjern all dritt i RAM
	ldx #0				; Vi bruker X til å telle bytes
.loop	sta <$00,x			; Lagre A (0) i $00 + x
	sta $100,x			; Lagre A (0) i $100 + x
	sta $200,x			; osv...
	sta $300,x
	sta $400,x
	sta $500,x
	sta $600,x
	sta $700,x			; Frem til $700 + x
	inx				; Øk X med 1
	bne .loop			; Hvis ikke 0, hopper vi opp igjen
	
	; Sett stack-pekeren til $FF
	txs				; X er nå $FF. Vi legger dette i S

	lda #1				; Vi vil laste nametable 1
	sta Nametable
	lda #0				; Vi er i lastingsmodus
	sta modus
	lda #01				; Paletten til skriften skal begynne
	sta tpal			; på 02 (blå). Lagre i tpal
	lda #240			; Start å scrolle fra offset 150
	sta scrollx			; Lagre i scroll-variabelen


	; Fjern gamle sprite-data i SPR-RAM (på reset, må dette gjøres)
	lda #$02
	sta $4014

	; Last sprite-data fra PRG-ROM til RAM
ldspr:
	ldx #0
.loop	lda spritedata,x	
	sta $0300,x
	inx
	cpx #72
	bne .loop

	lda #low(tittelb)
	sta BaneLav
	lda #high(tittelb)
	sta BaneHoy
	jsr last_bdeskriptor

	; Vent på vblank før vi kjører på rendering igjen
.wvb3	lda $2002
	bpl .wvb3
	lda #%10001001
	sta $2000
	lda #%00011110
	sta $2001
	
	; Spillet er nå i tittelmodus. NMI-rutina får nå frie tøyler til å
	; gjøre grafikk-effektene i tittelen.
	lda #1
	sta modus
	jmp tittelloop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; tittelloop
;
; Denne loopen går hele tida, og sjekker om spilleren har trykket på start-
; knappen. Alt annet grafisk tar NMI-rutina seg av.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tittelloop:
	lda vblstatus
	cmp #1
	bne tittelloop
	dec vblstatus

	lda #1
	sta $4016
	lda #0
	sta $4016

	lda $4016
	and #1
	bne last_pvp
	lda $4016
	and #1
	bne last_pvc
	lda $4016
	lda $4016
	and #1
	bne last_spill
	lda $4016
	lda $4016
	lda $4016
	lda $4016
	jmp tittelloop

last_pvp:
	lda SpillType
	cmp #0				; Tittel
	bne tittelloop
	ldy #2				; 1 = skyer
	sty BgNummer
	lda #1
	sta SpillType
	jsr last_bane
	jmp hovedloop

last_pvc:
	lda SpillType
	cmp #0				; Tittel
	bne tittelloop
	ldy #2				; 1 = skyer
	sty BgNummer
	lda #2
	sta SpillType
	jsr last_bane
	jmp hovedloop

last_spill:
	lda VinnStatus
	cmp #0
	beq tittelloop
	ldy #2
	sty BgNummer
	jsr last_bane
	lda #0
	sta P1S1
	sta P1S2
	sta P2S1
	sta P2S2
	sta VinnStatus
	lda #100
	sta BallY
	sta BallX

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hovedloop
;
; Dette er spillets hovedloop som tar seg all kalkulering og ikke-grafisk
; når spillet kjører.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

hovedloop:
.spr0	bit $2002			; Har vi startet rendering?
	bvs .spr0			; Nei, vi hopper opp igjen
.spr1	bit $2002			; Er sprite 0 i kontakt med bakgrunn?
	bvc .spr1			; Nei, vi venter litt til

	lda scrollx			; A = scrollverdi
	sta $2005			; Lagre i $2005 (X)
	lda #0				; A = 0
	sta $2005			; Lagre i $2005 (Y)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	lda VinnStatus
	cmp #0
	bne sjekkp1
	jmp VinnOK

sjekkp1:
	; Er scoren 10 hos P1 eller P2?
	lda VinnStatus
	cmp #1
	bne sjekkp2
	lda P1S1
	cmp #9
	bne sjekkp2
	lda #10
	sta P1S2_T
	lda #9
	sta P1S1_T
	ldx #1				; P1 vant
	jmp SpillerVant			; Hopp i vei
sjekkp2:
	lda P2S1
	cmp #9
	bne SjekkStatus
	lda #10
	sta P2S2_T
	lda #9
	sta P2S1_T
	ldx #2
	jmp SpillerVant
	
SjekkStatus:
	lda VinnStatus
	cmp #2				; Gikk inn hos p1
	beq Player2

Player1:
	ldx P1S1
	inx
	cpx #10
	bne .ok
	ldx #0
	inc P1S2
.ok	stx P1S1

	lda #0
	sta Xret
	lda #130
	sta BallY
	lda #20
	sta BallX
	jmp VinnOK
	
Player2:
	ldx P2S1
	inx
	cpx #10
	bne .ok
	ldx #0
	inc P2S2
.ok	stx P2S1
	
	lda #1
	sta Xret
	lda #130
	sta BallY
	lda #230
	sta BallX

VinnOK:
	lda P1S1
	clc
	adc #9
	sta P1S1_T
	lda P1S2
	clc
	adc #9
	sta P1S2_T		; SCORE + 9 = TILE NUMMER TIL TALLET
	lda P2S1
	clc
	adc #9
	sta P2S1_T
	lda P2S2
	clc
	adc #9
	sta P2S2_T
	lda #0
	sta VinnStatus

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SjekkBall:
	lda Xret
	cmp #1
	beq XDek

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

XInk:	
	lda BallX
	cmp #232
	bne .ikke
	lda Pad2_YO
	sec
	sbc #8
	cmp BallY
	bcs .ikke
	lda Pad2_YN
	clc
	adc #16
	cmp BallY
	bmi .ikke
	lda Xret
	eor #1
	sta Xret
	jmp .XInkOK

.ikke	lda BallX
	cmp #244
	bne .XInkOK
	lda #1
	sta VinnStatus
	jmp SjekkY

.XInkOK	inc BallX
	inc BallX
	jmp SjekkY

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

XDek:	
	lda BallX
	cmp #14
	bne .ikke
	lda Pad1_YO
	sec
	sbc #8
	cmp BallY
	bcs .ikke
	lda Pad1_YN
	clc
	adc #16
	cmp BallY
	bmi .ikke
	lda Xret
	eor #1
	sta Xret
	jmp .XDekOK

.ikke	lda BallX
	cmp #4
	bne .XDekOK
	lda #2
	sta VinnStatus
	jmp SjekkY

.XDekOK	dec BallX
	dec BallX

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SjekkY:
	lda Yret
	cmp #1
	beq YDek

YInk:	lda BallY
	cmp #216
	bne .YInkOK
	lda Yret
	eor #1
	sta Yret
	jmp SjekkOK

.YInkOK	inc BallY
	inc BallY
	jmp SjekkOK

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

YDek:	lda BallY
	cmp #26
	bne .YDekOK
	lda Yret
	eor #1
	sta Yret
	jmp SjekkOK

.YDekOK	dec BallY
	dec BallY

SjekkOK:	
	lda #1
	sta $4016
	lda #0
	sta $4016

	lda $4016
	lda $4016
	lda $4016
	lda $4016
	lda $4016
	and #1
	beq .sned
	jsr pad1opp
.sned	lda $4016
	and #1
	beq .sven
	jsr pad1ned
.sven	lda $4016
	and #1
	beq .shoy
	jsr neste
.shoy	lda $4016
	and #1
	beq sjekkpl
	jsr forr

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

sjekkpl:
	; CPU eller player 2?
	lda SpillType
	cmp #2			; 2 = CPU
	beq CPU

kontroll2:	
	lda #1
	sta $4017
	lda #0
	sta $4017

	lda $4017
	lda $4017
	lda $4017
	lda $4017
	lda $4017
	and #1
	beq .sned
	jsr pad2opp
.sned	lda $4017
	and #1
	beq .sven
	jsr pad2ned
.sven	lda $4017
	and #1
	beq .shoy
	jsr neste
.shoy	lda $4017
	and #1
	beq .ingen
	jsr forr
.ingen	jmp hovedloop

	; Dum CPU-"AI"

CPU:	
	lda Xret
	cmp #0
	beq .sjekk
	jmp hovedloop
.sjekk	lda BallX
	cmp #140
	bcs .sjekk2
	jmp hovedloop
.sjekk2	lda Yret
	cmp #0
	bne .sopp
	lda Pad2_YO
	cmp BallY
	bmi .ned
.sopp	lda Pad2_YN
	clc
	adc #8
	cmp BallY
	bcs .opp
	jmp hovedloop
.opp	jsr pad2opp
	jmp hovedloop
.ned	jsr pad2ned
.nope	jmp hovedloop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

neste:	
	lda FNTeller
	cmp #4
	beq .last
	inc FNTeller
	rts	
.last 	lda #0
	sta FNTeller
	ldy BgNummer
	cpy #6
	beq .ikke
	iny
	iny
	sty BgNummer
	jsr last_bane
.ikke	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

forr:
	lda FNTeller
	cmp #4
	beq .last
	inc FNTeller
	rts
.last	lda #0
	sta FNTeller
	ldy BgNummer
	cpy #2
	beq .ikke
	dey
	dey
	sty BgNummer
	jsr last_bane
.ikke	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

pad1opp:
	lda #low(Pad1_YO)
	sta GLav
	lda #high(Pad1_YO)
	sta GHoy
	jmp dek_pad

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

pad1ned:
	lda #low(Pad1_YO)
	sta GLav
	lda #high(Pad1_YO)
	sta GHoy
	jmp ink_pad

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

pad2opp:
	lda #low(Pad2_YO)
	sta GLav
	lda #high(Pad2_YO)
	sta GHoy
	jmp dek_pad

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

pad2ned:
	lda #low(Pad2_YO)
	sta GLav
	lda #high(Pad2_YO)
	sta GHoy
	jmp ink_pad
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ink_pad:
	ldy #0
	lda [GLav],y
	cmp #175
	beq .nede
.loop	lda [GLav],y
	clc
	adc #1
	sta [GLav],y
	tya
	clc
	adc #4
	tay
	cpy #24
	bne .loop
.nede	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dek_pad:
	ldy #0
	lda [GLav],y
	cmp #25
	beq .oppe
.loop	lda [GLav],y
	sec
	sbc #1
	sta [GLav],y
	tya
	clc
	adc #4
	tay
	cpy #24
	bne .loop
.oppe	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SpillerVant:
	lda #0
	sta modus
.vblank	lda $2002
	bpl .vblank
	lda #0
	sta $2000
	sta $2001
	
	ldy #0
.loop	lda vinner_t1,y
	sta PrintBuffer,y
	cmp #$FF
	beq .ok
	iny
	jmp .loop

.ok	sta PrintBuffer,y
	ldy #7
	txa
	clc
	adc #48
	sta PrintBuffer,y

	ldx #0
.scloop	lda $0338,x
	sta $0400,x
	inx 
	cpx #16
	bne .scloop

	; Score over i SPR-RAM
	lda #$04
	sta $4014
	
	lda #low(vinner)
	sta BaneLav
	lda #high(vinner)
	sta BaneHoy
	jsr last_bdeskriptor

.vbl2	lda $2002
	bpl .vbl2
	lda #%10001000
	sta $2000
	lda #%00011110
	sta $2001

	lda #1
	sta modus
	lda #0
	sta scrollx
	jmp tittelloop

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; last_bane
;
; Laster og tegner en bane basert på dataene i en banedeskriptor
; Y holder banenummeret som indekserer bakgrunnsindeksen.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

last_bane:
	lda #0
	sta modus

.wvb1	lda $2002
	bpl .wvb1
	lda #0
	sta $2000
	sta $2001

	lda #low(bgindeks)
	sta GLav
	lda #high(bgindeks)
	sta GHoy

	lda [GLav],y	
	sta BaneLav
	iny
	lda [GLav],y
	sta BaneHoy
	jsr last_bdeskriptor

.wvb2	lda $2002
	bpl .wvb2
	lda #%10001000
	sta $2000
	lda #%00011110
	sta $2001

	lda #2
	sta modus
	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; last_bdeskriptor
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

last_bdeskriptor:

	; Vekk med alt dritt i nametablene
	lda #1
	sta Nametable
	jsr slett_nametable
	lda #2
	sta Nametable
	jsr slett_nametable
	
	ldy #0
	lda [BaneLav],y
	sta PalettLav
	iny
	lda [BaneLav],y
	sta PalettHoy
	
	iny
	lda [BaneLav],y
	sta AttributtLav
	iny
	lda [BaneLav],y
	sta AttributtHoy
	
	iny
	lda [BaneLav],y
	cmp #1
	beq .LD2

	lda #2
	sta Nametable
	iny
	lda [BaneLav],y
	sta TekstDeskLav
	iny
	lda [BaneLav],y
	sta TekstDeskHoy
	tya
	pha
	jsr print_deskriptor
	jsr last_attributt
	pla
	tay
	
.LD2	lda #1
	sta Nametable
	iny
	lda [BaneLav],y
	sta TekstDeskLav
	iny
	lda [BaneLav],y
	sta TekstDeskHoy
	iny
	lda [BaneLav],y
	sta ScrollInk
	jsr print_deskriptor
	jsr last_attributt	
	jsr last_palett
	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; slett_nametable
;
; Vekk med dritt :)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

slett_nametable:
	lda Nametable
	cmp #1
	bne .NT2
	lda #$20
	jmp .ok
.NT2	lda #$24
.ok	sta $2006
	lda #0
	sta $2006
	ldx #4
	ldy #0
.loop	sta $2007
	iny
	bne .loop
	dex
	bne .loop
	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; print_deskriptor
; 
; Printer et sett med strenger skrevet i en tekst-deskriptor som peker til
; strengene og koordinatene de skal ha.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

print_deskriptor:
	ldy #0
	lda [TekstDeskLav],y
	tax
.loop	iny
	lda [TekstDeskLav],y
	sta PrintLav
	iny
	lda [TekstDeskLav],y
	sta PrintHoy
	iny
	txa
	pha
	lda [TekstDeskLav],y
	tax
	iny
	tya
	pha
	lda [TekstDeskLav],y
	tay
	jsr print
	pla
	tay
	pla
	tax
	dex
	bne .loop
	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; last_attributt
;
; Last attributtdata fra AttributtLav-AttributtHoy til nametable i 
; Nametable. Attributtdataene kan være RLE-enkodet -- $FE gjenkjenner dette.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

last_attributt:
	lda Nametable
	cmp #1
	bne .NT2
	lda #$23
	jmp .ok
.NT2	lda #$27
.ok	sta $2006
	lda #$C0
	sta $2006
	ldy #0
.loop	lda [AttributtLav],y
	cmp #$FF
	beq .ferdig
	cmp #$FE
	bne .forts
.rle	iny
	lda [AttributtLav],y
	tax
	dex
	iny
	lda [AttributtLav],y
.rlel	sta $2007
	dex
	bne .rlel
.forts	sta $2007
	iny
	jmp .loop
.ferdig	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; print
;
; Viser en tekst på skjermen.
; PrintLav-PrintHoy holder adressen til strengen som skal printes. Strengen må
; avsluttes med 0 for å signalisere slutten. Y holder raden, X holder kolonnen.
; Nametable holder nametable som skal skrives til. #0 eller #1.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

print:
	lda Nametable
	cmp #1
	bne .NT2
	lda #$20
	jmp .ok
.NT2	lda #$24
.ok	sta $2006
	lda #0
	sta $2006
	cpy #0				; Vil vi kopiere til første rad?
	beq .rad0			; jepp, vi hopper over å finne raden

	; Vi skal finne frem til raden å skrive til, så vi vil øke VRAM-
	; adressen med 32 byte for hver gang (rad for rad)
	lda #%00000100
	sta $2000

	; Vi leser fra $2007 for å finne Ys adresse i VRAM
.finnY	lda $2007
	dey
	bne .finnY

	; Ys adresse er funnet, vi finner Xs offset inn i raden

.rad0	lda #0
	sta $2000
	cpx #0				; Vil vi kopiere til første kolonne?
	beq .kol0			; jepp, vi hopper over å finne kol.

.finnX	lda $2007
	dex
	bne .finnX

	; Nå har vi funnet adressene, på tide å kopiere teksten inn
	
.kol0	ldy #0				; Vi bruker Y som indeks i strengen
.print	lda [PrintLav],y		; Hent tegn fra strengen
	cmp #$FF			; Er tegnet FF?
	beq .print_ferdig		; Da er vi ferdige
	cmp #$FE			; Er tegnet FE?
	beq .rle			; Da er det en RLE-byte som skal utv.
	jmp .forts
.rle	iny
	lda [PrintLav],y		; Skaff antall utvidelser
	tax
	dex
	iny
	lda [PrintLav],y		; Skaff tenget som skal utvides
.rlel	sta $2007
	dex
	bne .rlel
.forts	sta $2007			; Hvis ikke lagrer vi tegnet
	iny				; ... og øker indeksen Y med 1
	jmp .print			; ... og hopper opp igjen

.print_ferdig
	rts				; Vi er ferdige -- returner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; last_palett
;
; Laster paletten fra PalettLav-PalettHoy
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

last_palett:
	lda #$3F
	sta $2006
	lda #0
	sta $2006

	ldy #0
.loop	lda [PalettLav],y
	sta $2007
	iny
	cpy #32
	bne .loop
	rts

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; NMI-kode
;
; Her gjøres all grafisk oppdatering etter hver frame er rendert.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

NMI:
	; Det første vi gjør, er å sette vblank-flagget til 1 for å vise at
	; vi nå er i vblank...
	inc vblstatus
	
	; Les fra $2002 for å resette $2006-retningen
	lda $2002
		
	; Det neste å gjøre her, er å sjekke om spillet er i tittel-
	; modus, eller spillmodus, og hoppe til rett plass.
	lda modus
	cmp #0				; 0 er lastingsmodus
	beq lsmod			; jepp, vi kjører lastings-NMI-kode
	cmp #1				; 1 er tittelmodus
	beq tittel			; jepp, vi hopper til tittelkoden

	; Hvis ikke 0 eller 1, antar vi 2, som er spillmodus...
	jmp spill

lsmod:	rti
	; Det vi gjør når tittelen vises, er å gjøre palett-trikset, og evt.
	; scrolle teksten til å begynne med.

tittel:	
	inc bildeteller
	lda bildeteller
	cmp #8
	beq .oppd_pal
	jmp .scrolltekst
	rti

.scrolltekst
	lda scrollx
	cmp #0
	beq .oppdater
	dec scrollx
	dec scrollx
	jmp .oppdater
	
.oppd_pal
	lda #0
	sta bildeteller	
	lda tpalflag
	cmp #1
	beq .sbcpal

	lda tpal
	clc
	adc #$10
	sta tpal
	cmp #$31
	bne .oppdater
	lda tpalflag
	eor #1
	sta tpalflag
	rti
.sbcpal	lda tpal
	sec
	sbc #$10
	sta tpal
	cmp #1
	bne .oppdater
	lda tpalflag
	eor #1
	sta tpalflag

.oppdater
	lda #$3F
	sta $2006
	lda #1
	sta $2006
	lda tpal
	sta $2007
	lda #$20
	sta $2006
	lda #0
	sta $2006
	lda scrollx
	sta $2005
	lda #0
	sta $2005
	rti

spill:
	lda #0
	sta $2003
	lda #$03
	sta $4014
	
	lda scrollx
	clc
	adc ScrollInk
	sta scrollx
	
	lda ScrollInk
	cmp #1
	bne .rask
	lda scrollx
	cmp #255
	bmi .nores
.rask	lda scrollx
	cmp #248
	bcc .nores
	lda #0
	sta scrollx
	lda scrolln
	eor #1
	sta scrolln

.nores	lda scrolln
	cmp #1
	bne .NT2
	lda #$20
	jmp .addrok
.NT2	lda #$24
.addrok	sta $2006
	lda #0
	sta $2006
	sta $2005
	sta $2005
IRQ:	rti

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Data-delen
;
; Her har vi alle dataene våre (tekst, palett, osv.)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; FELLESDATA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

linje:		.db $FE,$20,$04,$FF

spritedata:
	.db 20,8,%00100011,20
	.db 50,1,0,100
	
	; Paddle 1
	.db 60,2,1,8
	.db 68,3,1,8
	.db 76,3,1,8
	.db 84,3,1,8
	.db 92,3,1,8
	.db 100,4,1,8

	; Paddle 2
	.db 60,2,1,240
	.db 68,3,1,240
	.db 76,3,1,240
	.db 84,3,1,240
	.db 92,3,1,240
	.db 100,4,1,240
	
	; Player 1 score
	.db 11,9,2,8
	.db 11,10,2,18

	; Player 2 score
	.db 11,11,2,228
	.db 11,12,2,238

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Bakgrunnsindeks
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bgindeks:
		.db low(tittelb),high(tittelb)	; Peker til tittel
		.db low(bg1),high(bg1)	; Peker til bakgrunn 1
		.db low(bg2),high(bg2)	; Peker til bakgrunn 2
		.db low(bg3),high(bg3)	; Peker til bakgrunn 3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Banedeskriptor for tittelgrafikken
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tittelb:
		.db low(tittel_palett),high(tittel_palett)
		.db low(tittel_attributt),high(tittel_attributt)
		.db 1
		.db low(tittel_bk1),high(tittel_bk1)
		.db 1

tittel_bk1:
		.db 12
		.db low(log1),high(log1),10,5
		.db low(log2),high(log2),10,6
		.db low(log3),high(log3),10,7
		.db low(log4),high(log4),10,8
		.db low(log5),high(log5),10,9
		.db low(log6),high(log6),10,10
		.db low(log7),high(log7),10,11
		.db low(log8),high(log8),10,12
		.db low(log9),high(log9),10,13
		.db low(t2),high(t2),1,17
		.db low(t3),high(t3),2,18
		.db low(t1),high(t1),10,28
				
t1:		.db "@ 2006 JAFFE",$FF
t2:		.db "PRESS A FOR PLAYER VS. PLAYER",$FF
t3:		.db "PRESS B FOR PLAYER VS. CPU",$FF
log1:		.db $06,$FE,$09,$07,$08,$FF
log2:		.db $0C,$FE,$09,$00,$0D,$FF
log3:		.db $0C,$00,$03,$0E,$0F,$10,$0F,$03,$03,$00,$0D,$FF
log4:		.db $0C,$00,$03,$12,$13,$10,$0F,$10,$00,$00,$0D,$FF
log5:		.db $0C,$00,$03,$16,$17,$10,$0F,$03,$03,$00,$0D,$FF
log6:		.db $0C,$00,$03,$1A,$1B,$10,$0F,$10,$00,$00,$0D,$FF
log7:		.db $0C,$00,$03,$03,"BALL",$00,$00,$0D,$FF
log8:		.db $0C,$FE,$09,$00,$0D,$FF
log9:		.db $09,$FE,$09,$0A,$0B,$FF

tittel_attributt:
		.db $FE,$20,$55
		.db $FE,$18,$00
		.db $FE,$08,$AA,$FF

tittel_palett:
		.db $00,$11,$20,$20
		.db $00,$16,$28,$20
		.db $00,$30,$00,$00
		.db $00,$00,$00,$00
	
		.db $0F,$00,$00,$00
		.db $00,$00,$00,$00
		.db $00,$00,$00,$00
		.db $00,$00,$00,$00

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; BILDEDESKRIPTOR for bakgrunn 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bg1:
		.db low(bg1_palett),high(bg1_palett)
		.db low(bg1_attributt),high(bg1_attributt)
		.db 2
		.db low(bg1_bk),high(bg1_bk)
		.db low(bg1_bk),high(bg1_bk)
		.db 1

bg1_bk:
		.db 8
		.db low(linje),high(linje),0,3
		.db low(sky1),high(sky1),5,10
		.db low(sky2),high(sky2),5,11
		.db low(sky3),high(sky3),5,12
		.db low(sky1),high(sky1),20,19
		.db low(sky2),high(sky2),20,20
		.db low(sky3),high(sky3),20,21
		.db low(linje),high(linje),0,28
		
sky1:		.db $00,$00,$00,$5E,$61,$00,$00,$00,$FF
sky2:		.db $00,$5E,$5F,$62,$62,$60,$61,$00,$FF
sky3:		.db $5B,$5C,$5C,$5C,$5C,$5C,$5C,$5D,$FF

bg1_attributt:
		.db $FE,$08,$00
		.db $FE,$30,$55
		.db $FE,$08,$00,$FF

bg1_palett:
		.db $00,$30,$0F,$16		
		.db $00,$0F,$21,$30		; skyer
		.db $00,$30,$30,$30		
		.db $00,$30,$30,$30
	
		.db $11,$00,$20,$30		; ball
		.db $00,$00,$20,$30		; paddles
		.db $00,$07,$17,$27		; score
		.db $00,$11,$30,$30		; sprite 0 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; BILDEDESKRIPTOR for bakgrunn 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bg2:
		.db low(bg2_palett),high(bg2_palett)	; Palett
		.db low(bg2_attributt),high(bg2_attributt)	; Attributter
		.db 2						; Nametables
		.db low(bg2_bk1),high(bg2_bk1)			; Nametable 1
		.db low(bg2_bk2),high(bg2_bk2)			; Nametable 2
		.db 8						; Scrollfart

bg2_bk1:
		.db 8
		.db low(linje),high(linje),0,3
		.db low(surr1),high(surr1),1,5
		.db low(surr2),high(surr2),10,8
		.db low(surr3),high(surr3),8,10
		.db low(surr1),high(surr1),14,15
		.db low(surr1),high(surr1),9,23
		.db low(surr2),high(surr2),2,25
		.db low(linje),high(linje),0,28

bg2_bk2:
		.db 7
		.db low(linje),high(linje),0,3
		.db low(surr1),high(surr1),1,7
		.db low(surr2),high(surr2),10,11
		.db low(surr3),high(surr3),8,13
		.db low(surr1),high(surr1),14,19
		.db low(surr1),high(surr1),9,25
		.db low(linje),high(linje),0,28
		
; Tekst-settet til spillgrafikken
surr1:		.db $01,$01,$02,$02,$03,$03,$02,$02,$01,$01,$02,$02,$03,$03,$02,$02,$FF
surr2:		.db $01,$01,$02,$02,$03,$03,$02,$02,$FF
surr3:		.db $01,$01,$02,$02,$03,$03,$02,$02,$01,$01,$02,$02,$03,$03,$02,$02
		.db $01,$01,$02,$02,$03,$03,$02,$02,$01,$01,$02,$02,$FF

bg2_attributt:
		.db $FE,$08,$00
		.db $FE,$08,$AA
		.db $FE,$08,$FF
		.db $FE,$08,$55
		.db $FE,$08,$FF
		.db $FE,$08,$AA
		.db $FE,$08,$55
		.db $FE,$08,$00,$FF

; Palett

bg2_palett:
		.db $00,$30,$0F,$16		; tekst-palett
		.db $00,$0A,$1A,$2A		; disse tre linjene
		.db $00,$0C,$1C,$2C		; ...
		.db $00,$04,$14,$24		; er paletten til strekene

		.db $0F,$0C,$1C,$2C
		.db $00,$04,$14,$24
		.db $00,$07,$17,$27
		.db $00,$0F,$30,$30

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bg3:
		.db low(bg3_palett),high(bg3_palett)
		.db low(bg1_attributt),high(bg1_attributt)
		.db 2
		.db low(bg3_bk),high(bg3_bk)
		.db low(bg1_bk),high(bg1_bk)
		.db 1

bg3_bk:
		.db 18
		.db low(linje),high(linje),0,3
		.db low(bg3_1),high(bg3_1),8,12
		.db low(bg3_2),high(bg3_2),7,13
		.db low(bg3_3),high(bg3_3),10,14
		.db low(bg3_4),high(bg3_4),10,15
		.db low(bg3_5),high(bg3_5),10,16
		.db low(bg3_3),high(bg3_3),10,17
		.db low(bg3_6),high(bg3_6),6,18
		.db low(bg3_7),high(bg3_7),4,19
		.db low(bg3_8),high(bg3_8),4,20
		.db low(bg3_8),high(bg3_8),4,21
		.db low(bg3_8),high(bg3_8),4,22
		.db low(bg3_8),high(bg3_8),4,23
		.db low(bg3_8),high(bg3_8),4,24
		.db low(bg3_8),high(bg3_8),4,25
		.db low(bg3_8),high(bg3_8),4,26
		.db low(bg3_8),high(bg3_8),4,27
		.db low(linje),high(linje),0,28

bg3_1:		.db $5E,$5F,$60,$61,$FF
bg3_2:		.db $5B,$5C,$5C,$63,$FE,$05,$64,$67,$FF
bg3_3:		.db $65,$FE,$05,$68,$66,$FF
bg3_4:		.db $65,$FE,$05,$68,$66,$60,$61,$FF
bg3_5:		.db $65,$FE,$05,$68,$66,$5C,$5C,$5D,$FF
bg3_6:		.db $63,$64,$64,$64,$67,$FE,$05,$68,$66,$FF
bg3_7:		.db $63,$64,$64,$67,$68,$68,$66,$FE,$05,$68,$66,$FF
bg3_8:		.db $65,$68,$68,$66,$68,$68,$66,$FE,$05,$68,$66,$FF

bg3_palett:
		.db $00,$30,$0F,$16		
		.db $00,$00,$1D,$2D		; skyer, hus
		.db $00,$30,$30,$30		
		.db $00,$30,$30,$30
	
		.db $0F,$00,$20,$30		; ball
		.db $00,$00,$20,$30		; paddles
		.db $00,$07,$17,$27		; score
		.db $00,$0F,$30,$30		; sprite 0 		
		
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

vinner:
		.db low(bg2_palett),high(bg2_palett)
		.db low(vinner_attributt),high(vinner_attributt)
		.db 1
		.db low(vinner_bk),high(vinner_bk)
		.db 1
		
vinner_bk:
		.db 2
		.db low(PrintBuffer),high(PrintBuffer),10,12
		.db low(vinner_t2),high(vinner_t2),3,14
		
vinner_t1:	.db "PLAYER   WON!",$FF
vinner_t2:	.db "PRESS START TO PLAY AGAIN!",$FF
		
vinner_attributt:
		.db $FE,$08,$55
		.db $FE,$30,$00
		.db $FE,$08,$55