;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*- init: ;; Set our custom NMI vector so that pressing restore quits lda #nmi sta $0319 ;; Reset gamemode lda #mode::StartScreen sta gamemode ;; Reset variables lda #0 sta p1score sta p2score sta p1y sta p2y sta exit lda #64 sta ball_x sta ball_y sei ;turn off IRQ while setting up lda #$7f sta CIA_ICR ;disable CIA IRQ bit CIA_ICR ;acknowledge it ;; Set up our graphics ldx #$00 stx BGCOL0 ;black background, appropriate for pong stx BORDER jsr loadtitlescreen lda #%00000111 sta SPRITE_ENABLE ;enable sprite 0,1,2 sta SSCOL sta SPRITE_BG_PRIO lda #%00000011 sta SPRITE_XPAND_Y lda #$01 sta SPRITE_0C sta SPRITE_1C sta SPRITE_2C lda #%00000010 sta SPRITE_X_MSB lda #$18 sta SPRITE_0X lda #$50 sta SPRITE_1X lda #$32 sta SPRITE_0Y sta SPRITE_1Y lda #$64 sta SPRITE_2X sta SPRITE_2Y ;; Load sprites ;; Note: breaks if we have more than 255 bytes of sprite gfx ldx #(sprite_data_end - sprite_data) ;DANGER ldy #$00 @loadloop: lda sprite_data,y sta SPRITEBASE,y iny dex bne @loadloop ;; done when X is zero ;; lda #scorestr ;; sta z:zscratch1 ;; ldx #4 ;; jsr printstr ;; Set up our own IRQ routine lda #irq sta CINV+1 ldx #$0 stx RASTER ;trigger IRQ on scanline 0 (vblank) ldx #%00000101 ;raster & sprite-sprite col IRQs stx VICINTMASK ;enable VIC IRQ cli ;turn IRQ back on, we're ready idle: jmp idle ;do nothing forever, game is driven by IRQ nmi: brk clearscreen: ;; Let's clear the background lda #VMBASE sta z:zscratch1 lda #COLORMEM sta z:zscratch3 ldx #$04 @loopouter: ldy #$00 @loopinner: lda #$20 sta (zscratch0),y lda #$01 ;write the color white sta (zscratch2),y ;to every part of color RAM iny bne @loopinner inc z:zscratch1 ;increment page inc z:zscratch3 dex bne @loopouter ;; Set up sprites ;; sprite ptr $d0 = memory location $3400 ldx #$d0 stx VMBASE+($400 - 8) stx VMBASE+($400 - 7) inx stx VMBASE+($400 - 6) rts loadtitlescreen: jsr clearscreen lda #title sta z:zscratch1 ldx #$0a ldy #$0b jsr printstr lda #<credits sta z:zscratch0 lda #>credits sta z:zscratch1 ldx #$0c ldy #$0e jsr printstr lda #<tutorial2 sta z:zscratch0 lda #>tutorial2 sta z:zscratch1 ldx #$09 ldy #$15 jsr printstr lda #<tutorial1 sta z:zscratch0 lda #>tutorial1 sta z:zscratch1 ldx #$0a ldy #$17 jsr printstr rts title: .byte $10, $0F, $0E, $07, $2C, $20, $0D, $0F, $12, $05, $20, $0F, $12, $20, $0C, $05, $13, $13, 0 credits: .byte $0D, $01, $04, $05, $20, $02, $19, $20, $04, $15, $15, $11, $0E, $04, 0 tutorial1: .byte $03, $0F, $0E, $14, $12, $0F, $0C, $20, $17, $09, $14, $08, $20, $11, $01, $20, $0F, $0C, 0 tutorial2: .byte $10, $12, $05, $13, $13, $20, $13, $10, $01, $03, $05, $20, $14, $0F, $20, $13, $14, $01, $12, $14, 0 loadgamefield: jsr clearscreen ;; now we'll draw the center column ldx #$25 @lineloop: lda scrlinelo,x sta z:zscratch0 lda scrlinehi,x sta z:zscratch1 txa and #%00000001 bne @skipdot lda #103 ldy #20 sta (zscratch0),y jmp @next @skipdot: lda #116 ldy #19 sta (zscratch0),y @next: dex bpl @lineloop rts