c64-basic/paddle-ball/paddle-ball.asm

189 lines
2.5 KiB
NASM

!cpu 6510
; Self-starting BASIC line: 10 SYS2061
* = $0801
!word basic_end
!word 10
!byte $9e
!text "2061"
!byte 0
basic_end: !word 0
* = $080d
start:
lda $d020
sta old_border
lda $d021
sta old_background
lda #147
jsr $ffd2
ldx #0
title_loop:
lda title,x
beq new_ball
jsr $ffd2
inx
bne title_loop
new_ball:
lda #20
sta paddle_x
lda #20
sta ball_x
lda #10
sta ball_y
lda #1
sta dx
sta dy
main_loop:
jsr erase_objects
jsr read_key
cmp #81
bne not_quit
jmp exit
not_quit:
cmp #65
bne check_right
lda paddle_x
beq check_right
dec paddle_x
check_right:
cmp #68
bne update_ball
lda paddle_x
cmp #34
beq update_ball
inc paddle_x
update_ball:
lda ball_x
clc
adc dx
sta ball_x
beq bounce_x
cmp #39
bne move_y
bounce_x:
lda dx
eor #$fe
clc
adc #1
sta dx
move_y:
lda ball_y
clc
adc dy
sta ball_y
beq bounce_y
cmp #22
bne draw
lda ball_x
cmp paddle_x
bcc missed
sec
sbc paddle_x
cmp #6
bcc bounce_y
missed:
jsr draw_objects
wait_serve:
jsr $ffe4
cmp #81
bne serve_key
jmp exit
serve_key:
cmp #32
bne wait_serve
jmp new_ball
bounce_y:
lda dy
eor #$fe
clc
adc #1
sta dy
draw:
jsr draw_objects
ldx #6
delay_outer:
ldy #0
delay_inner:
dey
bne delay_inner
dex
bne delay_outer
jmp main_loop
erase_objects:
lda #32
jsr draw_ball
ldx #5
erase_paddle:
txa
pha
clc
adc paddle_x
tax
ldy #23
lda #32
jsr plot
pla
tax
dex
bpl erase_paddle
rts
draw_objects:
lda #81
jsr draw_ball
ldx #5
draw_paddle:
txa
pha
clc
adc paddle_x
tax
ldy #23
lda #160
jsr plot
pla
tax
dex
bpl draw_paddle
rts
draw_ball:
pha
ldx ball_x
ldy ball_y
pla
plot:
sta char_value
lda row_lo,y
sta $fb
lda row_hi,y
sta $fc
txa
tay
lda char_value
sta ($fb),y
rts
read_key:
jsr $ffe4
rts
exit:
lda old_border
sta $d020
lda old_background
sta $d021
lda #147
jsr $ffd2
rts
title: !byte 147
!text "PADDLE BALL A/D MOVE SPACE SERVE Q QUIT"
!byte 13,0
row_lo: !for i,0,24 { !byte <($0400+i*40) }
row_hi: !for i,0,24 { !byte >($0400+i*40) }
paddle_x: !byte 0
ball_x: !byte 0
ball_y: !byte 0
dx: !byte 0
dy: !byte 0
char_value: !byte 0
old_border: !byte 0
old_background: !byte 0