processor 6502 include "vcs.h" include "macro.h" include "xmacro.h" seg.u Variables org $80 Score0 byte ; BCD score of player 0 Score1 byte ; BCD score of player 1 FontBuf ds 10 ; 2x5 array of playfield bytes Temp byte ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; seg Code org $f000 Start CLEAN_START lda #$09 sta Score0 lda #$42 sta Score1 NextFrame VERTICAL_SYNC TIMER_SETUP 37 lda Score0 ldx #0 jsr GetBCDBitmap lda Score1 ldx #5 jsr GetBCDBitmap TIMER_WAIT TIMER_SETUP 192 ; Draw 192 scanlines. ; First, we'll draw the scoreboard. ; Put the playfield into score mode (bit 2) which gives ; two different colors for the left/right side of ; the playfield (given by COLUP0 and COLUP1). lda #%00010010 ; score mode + 2 pixel ball sta CTRLPF lda #$48 sta COLUP0 ; set color for left lda #$a8 sta COLUP1 ; set color for right ; Now we draw all four digits. ldy #0 ; Y will contain the frame Y coordinate ScanLoop1a sta WSYNC tya lsr ; divide Y by two for double-height lines tax ; -> X lda FontBuf+0,x sta PF1 ; set left score bitmap SLEEP 28 lda FontBuf+5,x sta PF1 ; set right score bitmap iny cpy #10 bcc ScanLoop1a ; Clear the playfield lda #0 sta WSYNC sta PF1 ; Turn playfield reflection off, since our brick field ; will be drawn asymetrically (and turn score mode off) lda #%00010100 ; no reflection + ball priority + 2 pixel ball sta CTRLPF TIMER_WAIT TIMER_SETUP 30 TIMER_WAIT jmp NextFrame ; Fetches bitmap data for two digits of a ; BCD-encoded number, storing it in addresses ; FontBuf+x to FontBuf+4+x. GetBCDBitmap subroutine ; First fetch the bytes for the 1st digit pha ; save original BCD number and #$0F ; mask out the least significant digit sta Temp asl asl adc Temp ; multiply by 5 tay ; -> Y lda #5 sta Temp ; count down from 5 .loop1 lda DigitsBitmap,y and #$0F ; mask out leftmost digit sta FontBuf,x ; store leftmost digit iny inx dec Temp bne .loop1 ; Now do the 2nd digit pla ; restore original BCD number lsr lsr lsr lsr ; shift right by 4 (in BCD, divide by 10) sta Temp asl asl adc Temp ; multiply by 5 tay ; -> Y dex dex dex dex dex ; subtract 5 from X (reset to original) lda #5 sta Temp ; count down from 5 .loop2 lda DigitsBitmap,y and #$F0 ; mask out leftmost digit ora FontBuf,x ; combine left and right digits sta FontBuf,x ; store combined digits iny inx dec Temp bne .loop2 rts org $FF00 ; Bitmap pattern for digits DigitsBitmap .byte $0E ; | XXX | .byte $0A ; | X X | .byte $0A ; | X X | .byte $0A ; | X X | .byte $0E ; | XXX | .byte $22 ; | X X | .byte $22 ; | X X | .byte $22 ; | X X | .byte $22 ; | X X | .byte $22 ; | X X | .byte $EE ; |XXX XXX | .byte $22 ; | X X | .byte $EE ; |XXX XXX | .byte $88 ; |X X | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $22 ; | X X | .byte $66 ; | XX XX | .byte $22 ; | X X | .byte $EE ; |XXX XXX | .byte $AA ; |X X X X | .byte $AA ; |X X X X | .byte $EE ; |XXX XXX | .byte $22 ; | X X | .byte $22 ; | X X | .byte $EE ; |XXX XXX | .byte $88 ; |X X | .byte $EE ; |XXX XXX | .byte $22 ; | X X | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $88 ; |X X | .byte $EE ; |XXX XXX | .byte $AA ; |X X X X | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $22 ; | X X | .byte $22 ; | X X | .byte $22 ; | X X | .byte $22 ; | X X | .byte $EE ; |XXX XXX | .byte $AA ; |X X X X | .byte $EE ; |XXX XXX | .byte $AA ; |X X X X | .byte $EE ; |XXX XXX | .byte $EE ; |XXX XXX | .byte $AA ; |X X X X | .byte $EE ; |XXX XXX | .byte $22 ; | X X | .byte $EE ; |XXX XXX | ; Epilogue org $fffc .word Start .word Start