;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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