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