Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Name: PIC-PONG.ASM ;
- ; Use: DTI's version of the PONG game ;
- ;---------------------------------------------------;
- ; Copyright: (C)2012 DTI ;
- ; Dysfunctional Technologies, Inc. ;
- ; All Rights Reserved ;
- ;---------------------------------------------------;
- ; Author: Timothy S. Carlson ;
- ; Dysfunctional Technologies, Inc. ;
- ; Date: December 18, 2012 ;
- ; Version: V3.01 ;
- ;---------------------------------------------------;
- ; VERSION LOG: ;
- ; V3.00: Modified characters, character placement, ;
- ; and field to look more like the real PONG ;
- ; V3.01: Renamed to PIC-PONG ;
- ; Added 64x224 mode for copyright message ;
- ; Added piezo speaker for sounds ;
- ; Added ball 'slow-down' method ;
- ; Added special dot to field as court divider;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- #DEFINE _PONG.ASM_ ;
- #DEFINE _MAIN_MODULE_ ;
- ;---------------------------------------------------;
- #DEFINE _USE_THUMBSTICKS_ ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Includes ;
- ;---------------------------------------------------;
- #INCLUDE Common.INC ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Macros ;
- ;---------------------------------------------------;
- DELAY MACRO DTIME ;
- MOVLW DTIME ;
- MOVWF DTemp ;
- DECFSZ DTemp, F ;
- GOTO $-1 ;
- ENDM ;
- ;
- DO_BIT MACRO THISBIT, NOPS ;
- BTFSC INDF1, THISBIT ;
- BSF PORTA, VIDEO_0_BIT ;
- BTFSS INDF1, THISBIT ;
- BCF PORTA, VIDEO_0_BIT ;
- #IF NOPS > 0 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 1 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 2 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 3 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 4 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 5 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 6 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 7 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 8 ;
- NOP ;
- #ENDIF ;
- #IF NOPS > 9 ;
- NOP ;
- #ENDIF ;
- ENDM ;
- ;
- SET_SIGNAL MACRO COLOR ;
- MOVFW PORTA ;
- ANDLW VIDEO_MASK ;
- IORLW COLOR ;
- MOVWF PORTA ;
- ENDM ;
- ;
- NEG_SYNC_4US MACRO ;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_SYNC ;
- BTFSS System_Status, BUZZ_BIT ;
- GOTO $+16 ;
- DECFSZ Buzz_Count, F ;
- GOTO $+16 ;
- MOVFW Buzz_Reload ;
- MOVWF Buzz_Count ;
- BANKSEL TRISA ;
- BCF TRISA, RBUTT_BIT ; Set as OUTPUT
- BANKSEL MEMORY ;
- MOVLW RBUTT ;
- XORWF PORTA, F ;
- DECFSZ Buzz_Dur_LO, F ;
- GOTO $+16 ;
- DECFSZ Buzz_Dur_HI, F ;
- GOTO $+16 ;
- BCF System_Status, BUZZ_BIT ;
- GOTO $+15 ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- MOVLW 3 ;
- MOVWF DTemp ;
- DECFSZ DTemp, F ;
- GOTO $-1 ;
- NOP ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- NEG_SYNC_2US MACRO ;
- ;-----------------------------------------------;
- ; 2us Negative Sync Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_SYNC ;
- MOVLW 3 ;
- MOVWF DTemp ;
- DECFSZ DTemp, F ;
- GOTO $-1 ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- POS_SYNC_2US MACRO ;
- ;-----------------------------------------------;
- ; 2us Positive Sync Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- MOVLW 3 ;
- MOVWF DTemp ;
- DECFSZ DTemp, F ;
- GOTO $-1 ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ENDM ;
- ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; Defines ;
- ;---------------------------------------------------;
- #IFDEF _USE_THUMBSTICKS_ ;
- #DEFINE RJOY H'01' ;
- #DEFINE RJOY_BIT 0 ; GPIO 0 - PIN 7
- #DEFINE RBUTT H'02' ;
- #DEFINE RBUTT_BIT 1 ; GPIO 1 - PIN 6
- #DEFINE LJOY H'04' ;
- #DEFINE LJOY_BIT 2 ; GPIO 2 - PIN 5
- #DEFINE LBUTT H'08' ;
- #DEFINE LBUTT_BIT 3 ; GPIO 3 - PIN 4
- #ELSE ;!_USE_THUMBSTICKS_ ;
- #DEFINE RBUTT_1 H'01' ;
- #DEFINE RBUTT_1_BIT 0 ; GPIO 0 - PIN 7
- #DEFINE RBUTT_2 H'02' ;
- #DEFINE RBUTT_2_BIT 1 ; GPIO 1 - PIN 6
- #DEFINE LBUTT_2 H'04' ;
- #DEFINE LBUTT_2_BIT 2 ; GPIO 2 - PIN 5
- #DEFINE LBUTT_1 H'08' ;
- #DEFINE LBUTT_1_BIT 3 ; GPIO 3 - PIN 4
- #ENDIF ;_USE_THUMBSTICKS_ ;
- ;
- #DEFINE VIDEO_1 H'10' ; 1K ohm
- #DEFINE VIDEO_1_BIT 4 ; GPIO 5 - PIN 2
- #DEFINE VIDEO_0 H'20' ; 470 ohm
- #DEFINE VIDEO_0_BIT 5 ; GPIO 4 - PIN 3
- ;
- #DEFINE VIDEO_MASK H'CF' ;
- #DEFINE COLOR_WHITE (VIDEO_0 + VIDEO_1) ;
- #DEFINE COLOR_BLACK VIDEO_1 ;
- #DEFINE COLOR_SYNC 0 ;
- #DEFINE MAX_LINES 56 ;
- #DEFINE DRAW_BALL_BIT 0 ;
- #DEFINE MAX_BALL_WAIT 3 ;
- #DEFINE VIDEO_BUFFER_START H'2010' ;
- #DEFINE LEFT_SCORE_START H'01' ;
- #DEFINE RIGHT_SCORE_START H'02' ;
- #DEFINE LEFT_PADDLE_START H'00' ;
- #DEFINE LEFT_PADDLE_BIT H'40' ;
- #DEFINE LEFT_PADDLE_MASK H'BF' ;
- #DEFINE RIGHT_PADDLE_START H'03' ;
- #DEFINE RIGHT_PADDLE_BIT H'02' ;
- #DEFINE RIGHT_PADDLE_MASK H'FD' ;
- #DEFINE PADDLE_SIZE 8 ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- USER_DATA_1 UDATA H'020' ;
- ;---------------------------------------------------;
- Ball_X res 1 ; 20
- Ball_Y res 1 ; 21
- Ball_Dir_X res 1 ; 22
- Ball_Dir_Y res 1 ; 23
- Paddle_1_Y res 1 ; 24
- Paddle_2_Y res 1 ; 25
- Score_1 res 1 ; 26
- Score_2 res 1 ; 27
- Ball_Wait res 1 ; 29
- #DEFINE BUZZ H'01' ;
- #DEFINE BUZZ_BIT 0 ;
- System_Status res 1 ; 28
- ;---------------------------------------------------;
- USER_DATA_2 UDATA_SHR H'070' ;
- ;---------------------------------------------------;
- Temp1 res 1 ; 70
- Temp2 res 1 ; 71
- DTemp res 1 ; 72
- DL_Count res 1 ; 73
- Line_Data res 4 ; 74-77
- Byte_Count res 1 ; 78
- Repeat_Count res 1 ; 79
- Buzz_Count res 1 ; 7A
- Buzz_Reload res 1 ; 7B
- Buzz_Dur_HI res 1 ; 7C
- Buzz_Dur_LO res 1 ; 7D
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- RESET_VECT CODE H'000' ;
- ;---------------------------------------------------;
- CALL _Initialize_System ;
- NOP ;
- NOP ;
- GOTO _MAIN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- USER_CODE_1 CODE H'004' ;
- ;---------------------------------------------------;
- _MAIN: ;
- ;---------------------------------------------------;
- GOTO _Next_Frame ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Next_Frame: ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; VERTICAL SYNC PULSE Time ;
- ; This consists of 5 blank half lines, ;
- ; 4 inverted half lines, and 5 more blank half ;
- ; lines. This totals 12 full lines of 64us each.;
- ; --------------------------------------------- ;
- ; NOTE: Timing is CRITICAL for a nice, clean ;
- ; display. If you notice the top part of the ;
- ; display is skewed or "tearing", your timings ;
- ; are wrong and need to be adjusted. Make sure ;
- ; you haven't inadvertently dropped a half frame;
- ;-----------------------------------------------;
- CALL _Blank_Half_Line ;
- CALL _Blank_Half_Line ;
- CALL _Blank_Half_Line ;
- CALL _Blank_Half_Line ;
- ;
- CALL _Transition_Half_Line ;
- ;
- CALL _Inverted_Half_Line ;
- CALL _Inverted_Half_Line ;
- CALL _Special_Half_Line ;
- ;
- CALL _Blank_Half_Line ;
- CALL _Blank_Half_Line ;
- CALL _Blank_Half_Line ;
- CALL _Blank_Half_Line ;
- CALL _Blank_Half_Line ;
- NOP ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Just a bunch of BLANK LINES, so that the video;
- ; data doesn't start in the non-display area. ;
- ; Add or remove lines to adjust the verticle ;
- ; position of your video. If you add or remove, ;
- ; make sure to adjust the number of BLANK LINES ;
- ; which follow the data lines, so that the video;
- ; stays at 60hz ;
- ;-----------------------------------------------;
- MOVLW 15 ;
- MOVWF Temp1 ;
- CALL _Blank_Line ;
- DECFSZ Temp1, F ;
- GOTO $-2 ;
- ;
- ;-----------------------------------------------;
- ; 224 Data lines ;
- ;-----------------------------------------------;
- CALL _Data_Lines ;
- ;
- ;-----------------------------------------------;
- ; Another 8 blank lines. So, to summarize: ;
- ; (note - I needed four full 60us frames for ;
- ; the game processing (paddles, ball, scores, ;
- ; etc.), so I moved four blank line there for ;
- ; use for those routines) ;
- ; ;
- ; - 12 VERTICAL SYNC lines ;
- ; - 21 BLANK LINES ;
- ; - 224 DATA LINES ;
- ; - 8 BLANK LINES ;
- ; ;
- ; For a total of 265 lines at 64us each, or ;
- ; 16.96ms, or approximately 60hz. 16.6666ms ;
- ; would be _perfect_. ;
- ;-----------------------------------------------;
- ; MOVLW 2 ;
- ; MOVWF Temp1 ;
- ; CALL _Blank_Line ;
- ; DECFSZ Temp1, F ;
- ; GOTO $-2 ;
- ;-----------------------------------------------;
- ;
- CALL _Copyright ; 8 blank FULL line (60us)
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ; All of the game processing is done here, the ;
- ; last 4 full 60us blank lines ;
- ;-----------------------------------------------;
- CALL _Update_Ball ; 1 blank FULL line (60us)
- CALL _Update_Scores ; 1 blank FULL line (60us)
- CALL _Update_Paddle_1 ; 1 blank FULL line (60us)
- CALL _Update_Paddle_2 ; 1 blank FULL line (60us)
- ;-----------------------------------------------;
- ;
- GOTO _Next_Frame ;
- ;---------------------------------------------------;
- ;
- ;---------------------------------------------------;
- _Data_Lines: ;
- ;---------------------------------------------------;
- ; NOP ;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- ;
- MOVLW MAX_LINES ;
- MOVWF DL_Count ;
- ;
- MOVLW LOW VIDEO_BUFFER_START ;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- ;-----------------------------------------------;
- ; 60us Black Signal Generation ;
- ;-----------------------------------------------;
- DELAY 155 ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ;
- _DL_Next_Line: ;
- MOVLW 4 ;
- MOVWF Repeat_Count ;
- _DL_Repeat_Line: ;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Front porch - shifts the data to the right ;
- ; and hopefully centers it on the screen ;
- ; --------------------------------------------- ;
- ; NOTE: a DELAY 12 produces a nice 7.5us porch ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 15 ;
- ;-----------------------------------------------;
- ;
- MOVLW H'FC' ;
- ANDWF FSR1L, F ;
- MOVLW 4 ;
- MOVWF Byte_Count ;
- _DL_Next_Byte: ;
- ;-----------------------------------------------;
- ; This is where the 32 bits of data are actually;
- ; send out over the video signal ;
- ;-----------------------------------------------;
- DO_BIT 7, 8 ;
- DO_BIT 6, 8 ;
- DO_BIT 5, 8 ;
- DO_BIT 4, 8 ;
- DO_BIT 3, 8 ;
- DO_BIT 2, 8 ;
- DO_BIT 1, 8 ;
- DO_BIT 0, 1 ;
- ;
- ADDFSR FSR1, 1 ;
- ;
- _DL_Center_Line: ;
- MOVLW 3 ;
- XORWF Byte_Count, W ;
- BTFSS STATUS, Z ;
- GOTO _DL_Center_Line_Done ;
- NOP ;
- NOP ;
- NOP ;
- BCF PORTA, VIDEO_0_BIT ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- BSF PORTA, VIDEO_0_BIT ;
- NOP ;
- BCF PORTA, VIDEO_0_BIT ;
- _DL_Center_Line_Done: ;
- ;
- DECFSZ Byte_Count, F ;
- GOTO _DL_Next_Byte ;
- DECF FSR1L, F ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Back porch - between this and the front porch,;
- ; this 'frames' the video on your TV (hopefully);
- ; --------------------------------------------- ;
- ; NOTE: a DELAY 8 (plus a NOP) produces a ;
- ; nice 4.5us back porch, which fleshes out the ;
- ; data line to 60us ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 2 ;
- NOP ;
- NOP ;
- ; NOP ;
- ; NOP ;
- ; NOP ;
- ; NOP ;
- ; NOP ;
- ;-----------------------------------------------;
- ;
- DECFSZ Repeat_Count, F ;
- GOTO $+2 ;
- GOTO _DL_Next_Data ;
- ; NOP ;
- ; NOP ;
- ; NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- GOTO _DL_Repeat_Line ;
- ;
- ;-----------------------------------------------;
- ; 224 lines of information to transmit ;
- ; so the screen size is 32x224. But we transmit ;
- ; each line 4 times, so it's actually 32x56 ;
- ;-----------------------------------------------;
- _DL_Next_Data: ;
- NOP ;
- ADDFSR FSR1, 1 ;
- DECFSZ DL_Count, F ;
- GOTO _DL_Next_Line ;
- ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 60us Black Signal Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 154 ;
- NOP ;
- ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Blank_Line: ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 60us Black Signal Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 156 ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Transition_Half_Line: ;
- ;---------------------------------------------------;
- NOP ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ; 2us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_2US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 30us Blank Signal Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 73 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 2s Positive Sync Generation ;
- ;-----------------------------------------------;
- POS_SYNC_2US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 30us Inverted Signal Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_SYNC ;
- DELAY 77 ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Inverted_Half_Line: ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; 2s Positive Sync Generation ;
- ;-----------------------------------------------;
- POS_SYNC_2US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 30us Inverted Signal Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_SYNC ;
- DELAY 77 ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Special_Half_Line: ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; 2us Positive Sync Generation ;
- ;-----------------------------------------------;
- POS_SYNC_2US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 30us Sync Signal Generation (SPECIAL) ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_SYNC ;
- ;
- BANKSEL OPTION_REG ;
- BSF OPTION_REG, PSA ;
- BANKSEL TMR0 ;
- CLRF TMR0 ;
- ;
- BANKSEL TRISA ;
- BCF TRISA, 2 ;
- BANKSEL PORTA ;
- BCF PORTA, 2 ;
- NOP ;
- BSF PORTA, 2 ;
- BANKSEL TRISA ;
- BSF TRISA, 2 ;
- BANKSEL MEMORY ;
- ;
- DELAY 74 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 2us Positive Sync Generation (SPECIAL) ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 2 ;
- NOP ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Blank_Half_Line: ;
- ;---------------------------------------------------;
- NOP ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ; 2us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_2US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 30us Blank Signal Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 76 ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Update_Scores: ;
- ;---------------------------------------------------;
- ; This will retrieve the character font information ;
- ; from program memory and display the two scores ;
- ; at the top left and top right of the screen. ;
- ; NOTE: This is a FULL BLANK LINE routine ;
- ; (around 19us to display each score). ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 60us Blank Signal Generation ;
- ; But with lots of calculations going on ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- ;
- BANKSEL OPTION_REG ;
- BCF OPTION_REG, PSA ;
- BANKSEL TMR0 ;
- CLRF TMR0 ;
- ;
- _US_Draw_Score1: ;
- MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- CLRW ;
- MOVWI 0[INDF1] ;
- MOVWI 4[INDF1] ;
- MOVWI 8[INDF1] ;
- MOVWI 12[INDF1] ;
- MOVWI 16[INDF1] ;
- ;
- SWAPF Score_1, W ;
- ANDLW H'0F' ;
- MOVWF Temp1 ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ;
- MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- MOVLW 5 ;
- MOVWF Temp2 ;
- _US1_Draw_Left_Char: ;
- MOVLP HIGH CHARACTER_TABLE ;
- MOVFW Temp1 ;
- ADDLW LOW CHARACTER_TABLE ;
- BTFSC STATUS, C ;
- INCF PCLATH, F ;
- CALLW ;
- MOVWF DTemp ;
- RRF DTemp, W ;
- ANDLW H'70' ;
- MOVWF INDF1 ;
- ADDFSR FSR1, 4 ;
- INCF Temp1, F ;
- DECFSZ Temp2, F ;
- GOTO _US1_Draw_Left_Char ;
- ;
- MOVFW Score_1 ;
- ANDLW H'0F' ;
- MOVWF Temp1 ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ;
- MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- MOVLW 5 ;
- MOVWF Temp2 ;
- _US1_Draw_Right_Char: ;
- MOVLP HIGH CHARACTER_TABLE ;
- MOVFW Temp1 ;
- ADDLW LOW CHARACTER_TABLE ;
- BTFSC STATUS, C ;
- INCF PCLATH, F ;
- CALLW ;
- MOVWF DTemp ;
- RRF DTemp, W ;
- ANDLW H'07' ;
- MOVWF DTemp ;
- MOVFW INDF1 ;
- IORWF DTemp, W ;
- MOVWF INDF1 ;
- ADDFSR FSR1, 4 ;
- INCF Temp1, F ;
- DECFSZ Temp2, F ;
- GOTO _US1_Draw_Right_Char ;
- ;
- _US_Draw_Score2: ;
- MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- CLRW ;
- MOVWI 0[INDF1] ;
- MOVWI 4[INDF1] ;
- MOVWI 8[INDF1] ;
- MOVWI 12[INDF1] ;
- MOVWI 16[INDF1] ;
- ;
- SWAPF Score_2, W ;
- ANDLW H'0F' ;
- MOVWF Temp1 ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ;
- MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- MOVLW 5 ;
- MOVWF Temp2 ;
- _US2_Draw_Left_Char: ;
- MOVLP HIGH CHARACTER_TABLE ;
- MOVFW Temp1 ;
- ADDLW LOW CHARACTER_TABLE ;
- BTFSC STATUS, C ;
- INCF PCLATH, F ;
- CALLW ;
- ANDLW H'E0' ;
- MOVWF DTemp ;
- MOVWF INDF1 ;
- ADDFSR FSR1, 4 ;
- INCF Temp1, F ;
- DECFSZ Temp2, F ;
- GOTO _US2_Draw_Left_Char ;
- ;
- MOVFW Score_2 ;
- ANDLW H'0F' ;
- MOVWF Temp1 ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ADDWF Temp1, F ;
- ;
- MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- MOVLW 5 ;
- MOVWF Temp2 ;
- _US2_Draw_Right_Char: ;
- MOVLP HIGH CHARACTER_TABLE ;
- MOVFW Temp1 ;
- ADDLW LOW CHARACTER_TABLE ;
- BTFSC STATUS, C ;
- INCF PCLATH, F ;
- CALLW ;
- ANDLW H'0E' ;
- MOVWF DTemp ;
- MOVFW INDF1 ;
- IORWF DTemp, W ;
- MOVWF INDF1 ;
- ADDFSR FSR1, 4 ;
- INCF Temp1, F ;
- DECFSZ Temp2, F ;
- GOTO _US2_Draw_Right_Char ;
- ;
- NOP ;
- MOVFW TMR0 ;
- SUBLW 227 ;
- BTFSC STATUS, C ;
- GOTO $-3 ;
- NOP ;
- NOP ;
- NOP ;
- NOP ;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Update_Paddle_1: ;
- ;---------------------------------------------------;
- ; NOTE: This is a SINGLE FULL blank line routine - ;
- ; about 28us. It fits comfortably in a 60us window. ;
- ;---------------------------------------------------;
- NOP ;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 60us Blank Signal Generation ;
- ; But with lots of calculations going on ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- ;
- BANKSEL OPTION_REG ;
- BCF OPTION_REG, PSA ;
- BANKSEL TMR0 ;
- CLRF TMR0 ;
- ;
- _UP1_Clear_Paddle: ;
- MOVFW Paddle_1_Y ;
- ADDWF Paddle_1_Y, W ;
- ADDWF Paddle_1_Y, W ;
- ADDWF Paddle_1_Y, W ;
- ADDLW LOW VIDEO_BUFFER_START + LEFT_PADDLE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- MOVIW 0[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 0[INDF1] ;
- MOVIW 4[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 4[INDF1] ;
- MOVIW 8[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 8[INDF1] ;
- MOVIW 12[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 12[INDF1] ;
- MOVIW 16[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 16[INDF1] ;
- MOVIW 20[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 20[INDF1] ;
- MOVIW 24[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 24[INDF1] ;
- MOVIW 28[INDF1] ;
- ANDLW LEFT_PADDLE_MASK ;
- MOVWI 28[INDF1] ;
- ;
- #IFDEF _USE_THUMBSTICKS_ ;
- _UP1_Update: ;
- ;-----------------------------------------------;
- ; ADC Magic (Channel 0) ;
- ;-----------------------------------------------;
- BANKSEL ADCON1 ;
- MOVLW H'60' ; Left Justified
- MOVWF ADCON1 ; FOSC/64, VREF
- MOVLW B'00001011' ; AN2, ADC GO, ADC On
- MOVWF ADCON0 ;
- BTFSC ADCON0, GO ; Wait for conversion
- GOTO $-1 ;
- MOVFW ADRESH ; Get result
- BANKSEL MEMORY ;
- ;-----------------------------------------------;
- ;
- MOVWF Temp1 ;
- MOVLW H'60' ;
- SUBWF Temp1, W ;
- BTFSS STATUS, C ;
- DECF Paddle_1_Y, F ;
- MOVLW H'9F' ;
- SUBWF Temp1, W ;
- BTFSC STATUS, C ;
- INCF Paddle_1_Y, F ;
- BTFSC Paddle_1_Y, MSB ;
- CLRF Paddle_1_Y ;
- MOVLW 48 ;
- SUBWF Paddle_1_Y, W ;
- BTFSS STATUS, C ;
- GOTO _UP1_Update_Done ;
- MOVLW 48 ;
- MOVWF Paddle_1_Y ;
- _UP1_Update_Done: ;
- #ELSE ;!_USE_THUMBSTICKS_ ;
- _UP1_Check_Up: ;
- CLRW ;
- XORWF Paddle_1_Y, W ;
- BTFSC STATUS, Z ;
- GOTO _UP1_Check_Down ;
- BTFSS PORTA, LBUTT_1_BIT ;
- DECF Paddle_1_Y, F ;
- _UP1_Check_Down: ;
- MOVLW 48 ;
- XORWF Paddle_1_Y, W ;
- BTFSC STATUS, Z ;
- GOTO _UP1_Draw_Paddle ;
- BTFSS PORTA, LBUTT_2_BIT ;
- INCF Paddle_1_Y, F ;
- #ENDIF ;_USE_THUMBSTICKS_ ;
- ;
- _UP1_Draw_Paddle: ;
- MOVFW Paddle_1_Y ;
- ADDWF Paddle_1_Y, W ;
- ADDWF Paddle_1_Y, W ;
- ADDWF Paddle_1_Y, W ;
- ADDLW LOW VIDEO_BUFFER_START + LEFT_PADDLE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- MOVIW 0[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 0[INDF1] ;
- MOVIW 4[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 4[INDF1] ;
- MOVIW 8[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 8[INDF1] ;
- MOVIW 12[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 12[INDF1] ;
- MOVIW 16[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 16[INDF1] ;
- MOVIW 20[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 20[INDF1] ;
- MOVIW 24[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 24[INDF1] ;
- MOVIW 28[INDF1] ;
- IORLW LEFT_PADDLE_BIT ;
- MOVWI 28[INDF1] ;
- ;
- MOVFW TMR0 ;
- SUBLW 228 ;
- BTFSC STATUS, C ;
- GOTO $-3 ;
- NOP ;
- NOP ;
- NOP ;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Update_Paddle_2: ;
- ;---------------------------------------------------;
- ; NOTE: This is a SINGLE FULL blank line routine - ;
- ; about 28us. It fits comfortably in a 60us window. ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 60us Blank Signal Generation ;
- ; But with lots of calculations going on ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- ;
- BANKSEL OPTION_REG ;
- BCF OPTION_REG, PSA ;
- BANKSEL TMR0 ;
- CLRF TMR0 ;
- ;
- _UP2_Clear_Paddle: ;
- MOVFW Paddle_2_Y ;
- ADDWF Paddle_2_Y, W ;
- ADDWF Paddle_2_Y, W ;
- ADDWF Paddle_2_Y, W ;
- ADDLW LOW VIDEO_BUFFER_START + RIGHT_PADDLE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- MOVIW 0[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 0[INDF1] ;
- MOVIW 4[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 4[INDF1] ;
- MOVIW 8[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 8[INDF1] ;
- MOVIW 12[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 12[INDF1] ;
- MOVIW 16[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 16[INDF1] ;
- MOVIW 20[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 20[INDF1] ;
- MOVIW 24[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 24[INDF1] ;
- MOVIW 28[INDF1] ;
- ANDLW RIGHT_PADDLE_MASK ;
- MOVWI 28[INDF1] ;
- ;
- #IFDEF _USE_THUMBSTICKS_ ;
- _UP2_Update: ;
- ;-----------------------------------------------;
- ; ADC Magic (Channel 0) ;
- ;-----------------------------------------------;
- BANKSEL ADCON1 ;
- MOVLW H'60' ; Left Justified
- MOVWF ADCON1 ; FOSC/64, VREF
- MOVLW B'00000011' ; AN0, ADC GO, ADC On
- MOVWF ADCON0 ;
- BTFSC ADCON0, GO ; Wait for conversion
- GOTO $-1 ;
- MOVFW ADRESH ; Get result
- BANKSEL MEMORY ;
- ;-----------------------------------------------;
- ;
- MOVWF Temp1 ;
- MOVLW H'60' ;
- SUBWF Temp1, W ;
- BTFSS STATUS, C ;
- DECF Paddle_2_Y, F ;
- MOVLW H'9F' ;
- SUBWF Temp1, W ;
- BTFSC STATUS, C ;
- INCF Paddle_2_Y, F ;
- BTFSC Paddle_2_Y, MSB ;
- CLRF Paddle_2_Y ;
- MOVLW 48 ;
- SUBWF Paddle_2_Y, W ;
- BTFSS STATUS, C ;
- GOTO _UP2_Update_Done ;
- MOVLW 48 ;
- MOVWF Paddle_2_Y ;
- _UP2_Update_Done: ;
- #ELSE ;!_USE_THUMBSTICKS_ ;
- _UP2_Check_Up: ;
- CLRW ;
- XORWF Paddle_2_Y, W ;
- BTFSC STATUS, Z ;
- GOTO _UP2_Check_Down ;
- BTFSS PORTA, RBUTT_1_BIT ;
- DECF Paddle_2_Y, F ;
- _UP2_Check_Down: ;
- MOVLW 40 ;
- XORWF Paddle_2_Y, W ;
- BTFSC STATUS, Z ;
- GOTO _UP2_Draw_Paddle ;
- BTFSS PORTA, RBUTT_2_BIT ;
- INCF Paddle_2_Y, F ;
- #ENDIF ;_USE_THUMBSTICKS_ ;
- ;
- _UP2_Draw_Paddle: ;
- MOVFW Paddle_2_Y ;
- ADDWF Paddle_2_Y, W ;
- ADDWF Paddle_2_Y, W ;
- ADDWF Paddle_2_Y, W ;
- ADDLW LOW VIDEO_BUFFER_START + RIGHT_PADDLE_START;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- MOVIW 0[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 0[INDF1] ;
- MOVIW 4[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 4[INDF1] ;
- MOVIW 8[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 8[INDF1] ;
- MOVIW 12[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 12[INDF1] ;
- MOVIW 16[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 16[INDF1] ;
- MOVIW 20[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 20[INDF1] ;
- MOVIW 24[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 24[INDF1] ;
- MOVIW 28[INDF1] ;
- IORLW RIGHT_PADDLE_BIT ;
- MOVWI 28[INDF1] ;
- ;
- NOP ;
- MOVFW TMR0 ;
- SUBLW 228 ;
- BTFSC STATUS, C ;
- GOTO $-3 ;
- NOP ;
- NOP ;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Update_Ball: ;
- ;---------------------------------------------------;
- ; NOTE: This is a FULL blank line routine - ;
- ; about 17-18us. It fits comfortably in a 60us ;
- ; window. ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;
- ;-----------------------------------------------;
- ; 60us Blank Signal Generation ;
- ; But with lots of calculations going on ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- ;
- BANKSEL OPTION_REG ;
- BCF OPTION_REG, PSA ;
- BANKSEL TMR0 ;
- CLRF TMR0 ;
- ;
- _UB_Check_Wait: ;
- DECFSZ Ball_Wait, F ;
- GOTO _UB_Exit ;
- ;
- MOVLW MAX_BALL_WAIT ;
- MOVWF Ball_Wait ;
- ;
- CLRW ;
- XORWF Ball_Dir_X, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Clear_Ball ;
- CLRW ;
- XORWF Ball_Dir_Y, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Clear_Ball ;
- ;
- _UB_Check_L_Serve: ;
- BTFSC PORTA, LBUTT_BIT ;
- GOTO _UB_Check_R_Serve ;
- MOVLW 1 ;
- MOVWF Ball_Dir_X ;
- MOVLW 1 ;
- MOVWF Ball_Dir_Y ;
- MOVLW 16 ;
- MOVWF Ball_X ;
- MOVLW 27 ;
- MOVWF Ball_Y ;
- GOTO _UB_Service ;
- _UB_Check_R_Serve: ;
- BANKSEL TRISA ;
- BSF TRISA, RBUTT_BIT ;
- BANKSEL PORTA ;
- BTFSC PORTA, RBUTT_BIT ;
- GOTO _UB_Exit ;
- BANKSEL TRISA ;
- BCF TRISA, RBUTT_BIT ;
- BANKSEL PORTA ;
- MOVLW -1 ;
- MOVWF Ball_Dir_X ;
- MOVLW -1 ;
- MOVWF Ball_Dir_Y ;
- MOVLW 15 ;
- MOVWF Ball_X ;
- MOVLW 27 ;
- MOVWF Ball_Y ;
- _UB_Service: ;
- CALL _Clear_Court ;
- MOVLW H'11' ;
- XORWF Score_1, W ;
- BTFSC STATUS, Z ;
- GOTO $+5 ;
- MOVLW H'11' ;
- XORWF Score_2, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Draw_Ball ;
- CLRF Score_1 ;
- CLRF Score_2 ;
- GOTO _UB_Draw_Ball ;
- ;
- _UB_Clear_Ball: ;
- MOVFW Ball_Y ;
- ADDWF Ball_Y, W ;
- ADDWF Ball_Y, W ;
- ADDWF Ball_Y, W ;
- ADDLW LOW VIDEO_BUFFER_START ;
- MOVWF FSR1L ;
- RRF Ball_X, W ;
- MOVWF Temp1 ;
- RRF Temp1, F ;
- RRF Temp1, W ;
- ANDLW H'1F' ;
- ADDWF FSR1L, F ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- MOVFW Ball_X ;
- ANDLW H'07' ;
- MOVWF Temp1 ;
- MOVLW H'7F' ;
- MOVWF DTemp ;
- MOVLW 0 ; ;
- XORWF Temp1, W ;
- BTFSC STATUS, Z ;
- GOTO $+5 ;
- DECF Temp1, F ;
- RRF DTemp, F ;
- BSF DTemp, MSB ;
- GOTO $-7 ;
- ;
- MOVFW DTemp ;
- ANDWF INDF1, F ;
- ;
- MOVLW H'04' ;
- ADDWF FSR1L, F ;
- MOVFW DTemp ;
- ANDWF INDF1, F ;
- ;
- _UB_Update_Ball_X: ;
- MOVFW Ball_Dir_X ; Update Ball X Position
- ADDWF Ball_X, F ;
- ;
- _UB_Update_Ball_X_Min: ;
- MOVLW 0 ;
- XORWF Ball_X, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Update_Ball_X_Max ;
- MOVLW 1 ;
- MOVWF Ball_Dir_X ;
- ;
- INCF Score_2, F ;
- MOVLW 20 ;
- MOVWF Buzz_Count ;
- MOVWF Buzz_Reload ;
- MOVLW H'7F' ;
- MOVWF Buzz_Dur_LO ;
- MOVLW H'01' ;
- MOVWF Buzz_Dur_HI ;
- BSF System_Status, BUZZ_BIT ;
- MOVLW 0 ;
- MOVWF Ball_Dir_X ;
- MOVWF Ball_Dir_Y ;
- MOVLW 15 ;
- MOVWF Ball_X ;
- MOVLW 27 ;
- MOVWF Ball_Y ;
- MOVFW Score_2 ;
- ANDLW H'0F' ;
- XORLW H'0A' ;
- BTFSS STATUS, Z ;
- GOTO _UB_BXMin_Exit ;
- MOVFW Score_2 ;
- ANDLW H'F0' ;
- ADDLW H'10' ;
- MOVWF Score_2 ;
- MOVLW H'A0' ;
- XORWF Score_2, W ;
- BTFSC STATUS, Z ;
- CLRF Score_2 ;
- _UB_BXMin_Exit: ;
- MOVLW H'11' ;
- XORWF Score_2, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Exit ;
- CALL _Clear_Court ;
- CALL _Draw_Title ;
- GOTO _UB_Exit ;
- ;
- _UB_Update_Ball_X_Max: ;
- MOVLW 31 ;
- XORWF Ball_X, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Update_Ball_Y ;
- MOVLW -1 ;
- MOVWF Ball_Dir_X ;
- ;
- INCF Score_1, F ;
- MOVLW 20 ;
- MOVWF Buzz_Count ;
- MOVWF Buzz_Reload ;
- MOVLW H'7F' ;
- MOVWF Buzz_Dur_LO ;
- MOVLW H'01' ;
- MOVWF Buzz_Dur_HI ;
- BSF System_Status, BUZZ_BIT ;
- MOVLW 0 ;
- MOVWF Ball_Dir_X ;
- MOVWF Ball_Dir_Y ;
- MOVLW 15 ;
- MOVWF Ball_X ;
- MOVLW 27 ;
- MOVWF Ball_Y ;
- MOVFW Score_1 ;
- ANDLW H'0F' ;
- XORLW H'0A' ;
- BTFSS STATUS, Z ;
- GOTO _UB_BXMax_Exit ;
- MOVFW Score_1 ;
- ANDLW H'F0' ;
- ADDLW H'10' ;
- MOVWF Score_1 ;
- MOVLW H'A0' ;
- XORWF Score_1, W ;
- BTFSC STATUS, Z ;
- CLRF Score_1 ;
- _UB_BXMax_Exit: ;
- MOVLW H'11' ;
- XORWF Score_1, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Exit ;
- CALL _Clear_Court ;
- CALL _Draw_Title ;
- GOTO _UB_Exit ;
- ;
- _UB_Update_Ball_Y: ;
- MOVFW Ball_Dir_Y ; Update Ball Y Position
- ADDWF Ball_Y, F ;
- ;
- _UB_Update_Ball_Y_Min: ;
- MOVLW 0 ;
- XORWF Ball_Y, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Update_Ball_Y_Max ;
- MOVLW 1 ;
- MOVWF Ball_Dir_Y ;
- MOVLW 13 ;
- MOVWF Buzz_Count ;
- MOVWF Buzz_Reload ;
- MOVLW H'3F' ;
- MOVWF Buzz_Dur_LO ;
- MOVLW H'01' ;
- MOVWF Buzz_Dur_HI ;
- BSF System_Status, BUZZ_BIT ;
- GOTO _UB_Paddle_Detect ;
- ;
- _UB_Update_Ball_Y_Max: ;
- MOVLW 55 ;
- XORWF Ball_Y, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Paddle_Detect ;
- MOVLW -1 ;
- MOVWF Ball_Dir_Y ;
- MOVLW 13 ;
- MOVWF Buzz_Count ;
- MOVWF Buzz_Reload ;
- MOVLW H'3F' ;
- MOVWF Buzz_Dur_LO ;
- MOVLW H'01' ;
- MOVWF Buzz_Dur_HI ;
- BSF System_Status, BUZZ_BIT ;
- ;
- _UB_Paddle_Detect: ;
- _UB_Paddle_Detect_Left: ;
- MOVLW -1 ;
- XORWF Ball_Dir_X, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Paddle_Detect_Right ;
- ;
- MOVLW 2 ;
- XORWF Ball_X, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Draw_Ball ;
- ;
- MOVFW Paddle_1_Y ;
- SUBWF Ball_Y, W ;
- BTFSS STATUS, C ;
- GOTO _UB_Draw_Ball ;
- MOVFW Paddle_1_Y ;
- ADDLW 8 ;
- SUBWF Ball_Y, W ;
- BTFSC STATUS, C ;
- GOTO _UB_Draw_Ball ;
- MOVLW 1 ;
- MOVWF Ball_Dir_X ;
- MOVLW 15 ;
- MOVWF Buzz_Count ;
- MOVWF Buzz_Reload ;
- MOVLW H'3F' ;
- MOVWF Buzz_Dur_LO ;
- MOVLW H'01' ;
- MOVWF Buzz_Dur_HI ;
- BSF System_Status, BUZZ_BIT ;
- GOTO _UB_Draw_Ball ;
- ;
- _UB_Paddle_Detect_Right: ;
- MOVLW 1 ;
- XORWF Ball_Dir_X, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Draw_Ball ;
- ;
- MOVLW 29 ;
- XORWF Ball_X, W ;
- BTFSS STATUS, Z ;
- GOTO _UB_Draw_Ball ;
- ;
- MOVFW Paddle_2_Y ;
- SUBWF Ball_Y, W ;
- BTFSS STATUS, C ;
- GOTO _UB_Draw_Ball ;
- MOVFW Paddle_2_Y ;
- ADDLW 8 ;
- SUBWF Ball_Y, W ;
- BTFSC STATUS, C ;
- GOTO _UB_Draw_Ball ;
- MOVLW -1 ;
- MOVWF Ball_Dir_X ;
- MOVLW 15 ;
- MOVWF Buzz_Count ;
- MOVWF Buzz_Reload ;
- MOVLW H'3F' ;
- MOVWF Buzz_Dur_LO ;
- MOVLW H'01' ;
- MOVWF Buzz_Dur_HI ;
- BSF System_Status, BUZZ_BIT ;
- ;
- _UB_Draw_Ball: ;
- MOVFW Ball_Y ;
- ADDWF Ball_Y, W ;
- ADDWF Ball_Y, W ;
- ADDWF Ball_Y, W ;
- ADDLW LOW VIDEO_BUFFER_START ;
- MOVWF FSR1L ;
- RRF Ball_X, W ;
- MOVWF Temp1 ;
- RRF Temp1, F ;
- RRF Temp1, W ;
- ANDLW H'1F' ;
- ADDWF FSR1L, F ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- ;
- MOVFW Ball_X ;
- ANDLW H'07' ;
- MOVWF Temp1 ;
- MOVLW H'80' ;
- MOVWF DTemp ;
- MOVLW 0 ; ;
- XORWF Temp1, W ;
- BTFSC STATUS, Z ;
- GOTO $+5 ;
- DECF Temp1, F ;
- RRF DTemp, F ;
- BCF DTemp, MSB ;
- GOTO $-7 ;
- ;
- MOVFW DTemp ;
- IORWF INDF1, F ;
- ;
- MOVLW H'04' ;
- ADDWF FSR1L, F ;
- MOVFW DTemp ;
- IORWF INDF1, F ;
- ;
- _UB_Exit: ;
- BANKSEL TRISA ;
- BSF TRISA, RBUTT_BIT ;
- BANKSEL PORTA ;
- ;
- NOP ;
- MOVFW TMR0 ;
- SUBLW 227 ;
- BTFSC STATUS, C ;
- GOTO $-3 ;
- NOP ;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Initialize_System: ;
- ;---;-----------------------------------------------;
- ; Initialize Hardware ;
- ;-----------------------------------------------;
- BANKSEL OSCCON ;
- MOVLW B'11110000' ; 32Mhz
- MOVWF OSCCON ;
- ;
- BANKSEL OSCSTAT ; Wait for
- IS1:MOVFW OSCSTAT ; high speed
- ANDLW H'79' ; oscillator
- XORLW H'59' ; to be
- BTFSS STATUS, Z ; stable and
- GOTO IS1 ; locked
- ;
- BANKSEL ANSELA ;
- CLRF ANSELA ; ALL I/O as digital
- #IFDEF _USE_THUMBSTICKS_ ;
- BSF ANSELA, LJOY_BIT ;
- BSF ANSELA, RJOY_BIT ;
- #ENDIF ;_USE_THUMBSTICKS_ ;
- ;
- BANKSEL LATA ;
- CLRF LATA ;
- ;
- BANKSEL TRISA ;
- CLRF TRISA ;
- BCF TRISA, VIDEO_0_BIT ; Set as OUTPUT
- BCF TRISA, VIDEO_1_BIT ; Set As OUTPUT
- #IFDEF _USE_THUMBSTICKS_ ;
- BSF TRISA, LJOY_BIT ; Set as INPUT
- BSF TRISA, LBUTT_BIT ; Set as INPUT
- BSF TRISA, RJOY_BIT ; Set as INPUT
- BCF TRISA, RBUTT_BIT ; Set as OUTPUT (PIEZO)
- #ELSE ;!_USE_THUMBSTICKS_ ;
- BSF TRISA, LBUTT_1_BIT ; Set as INPUT
- BSF TRISA, LBUTT_2_BIT ; Set as INPUT
- BSF TRISA, RBUTT_1_BIT ; Set as INPUT
- BSF TRISA, RBUTT_2_BIT ; Set as INPUT
- #ENDIF ;_USE_THUMBSTICKS_ ;
- ;
- BANKSEL PORTA ;
- CLRF PORTA ;
- BCF PORTA, VIDEO_0_BIT ; Set LOW
- BCF PORTA, VIDEO_1_BIT ; Set LOW
- #IFDEF _USE_THUMBSTICKS_ ;
- BSF PORTA, LJOY_BIT ; Set HIGH
- BSF PORTA, LBUTT_BIT ; Set HIGH
- BSF PORTA, RJOY_BIT ; Set HIGH
- BSF PORTA, RBUTT_BIT ; Set HIGH
- #ELSE ;!_USE_THUMBSTICKS_ ;
- BSF PORTA, LBUTT_1_BIT ; Set HIGH
- BSF PORTA, LBUTT_2_BIT ; Set HIGH
- BSF PORTA, RBUTT_1_BIT ; Set HIGH
- BSF PORTA, RBUTT_2_BIT ; Set HIGH
- #ENDIF ;_USE_THUMBSTICKS_ ;
- ;
- BANKSEL INTCON ;
- CLRF INTCON ;
- ;
- BANKSEL OPTION_REG ;
- CLRF OPTION_REG ;
- ;
- ;-----------------------------------------------;
- ; Initialize Timer0 (for counting cycles) ;
- ;-----------------------------------------------;
- BANKSEL OPTION_REG ;
- BCF OPTION_REG, NOT_WPUEN ;
- BCF OPTION_REG, TMR0CS ;
- BCF OPTION_REG, PSA ; prescaler to timer0
- BCF OPTION_REG, PS2 ;
- BCF OPTION_REG, PS1 ; 000 - 250ns
- BCF OPTION_REG, PS0 ;
- BANKSEL TMR0 ;
- CLRF TMR0 ;
- ;
- ;-----------------------------------------------;
- ; Initialize Video Buffer ;
- ; Copy image from EEPROM into buffer memory ;
- ;-----------------------------------------------;
- BANKSEL MEMORY ;
- ; PAGESEL _Clear_Court ;
- CALL _Clear_Court ;
- ; PAGESEL HIGH _Draw_Title ;
- CALL _Draw_Title ;
- ;
- ;-----------------------------------------------;
- ; Initialize Memory ;
- ;-----------------------------------------------;
- BANKSEL MEMORY ;
- CLRF System_Status ;
- ; BSF System_Status, BUZZ_BIT ;
- MOVLW 1 ;
- MOVWF Buzz_Count ;
- MOVWF Buzz_Reload ;
- MOVLW H'FF' ;
- MOVWF Buzz_Dur_LO ;
- MOVLW H'FF' ;
- MOVWF Buzz_Dur_HI ;
- MOVLW MAX_BALL_WAIT ;
- MOVWF Ball_Wait ;
- MOVLW 0 ;
- MOVWF Score_1 ;
- MOVLW 0 ;
- MOVWF Score_2 ;
- MOVLW 20 ;
- MOVWF Paddle_1_Y ;
- MOVLW 20 ;
- MOVWF Paddle_2_Y ;
- MOVLW 15 ;
- MOVWF Ball_X ;
- MOVLW 27 ;
- MOVWF Ball_Y ;
- MOVLW 0 ;
- MOVWF Ball_Dir_X ;
- MOVLW 0 ;
- MOVWF Ball_Dir_Y ;
- ;
- ;-----------------------------------------------;
- ; Initialize Other Subsystems ;
- ;-----------------------------------------------;
- ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Copyright: ;
- ;---------------------------------------------------;
- ;-----------------------------------------------;
- ; Setup ;
- ;-----------------------------------------------;
- MOVLW LOW COPYRIGHT_TABLE ;
- MOVWF FSR1L ;
- MOVLW HIGH COPYRIGHT_TABLE ;
- MOVWF FSR1H ;
- MOVLW 8 ;
- MOVWF Temp1 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; 8 64us Data Line Generation ;
- ;-----------------------------------------------;
- _CR_Next_Line: ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ; 4us Negative Sync Generation ;
- ;-----------------------------------------------;
- NEG_SYNC_4US ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Xus Back Porch (Black Signal) Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- DELAY 4 ;13 ;17 ;
- NOP ;
- NOP ;
- NOP ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Data Generation ;
- ;-----------------------------------------------;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- DO_BIT 7, 1 ;
- DO_BIT 6, 1 ;
- DO_BIT 5, 1 ;
- DO_BIT 4, 1 ;
- DO_BIT 3, 1 ;
- DO_BIT 2, 1 ;
- DO_BIT 1, 1 ;
- DO_BIT 0, 0 ;
- ADDFSR FSR1, 1 ;
- ;-----------------------------------------------;
- ;
- ;-----------------------------------------------;
- ; Xus Front Porch (Black Signal) Generation ;
- ;-----------------------------------------------;
- SET_SIGNAL COLOR_BLACK ;
- ; DELAY 1 ;2 ;6 ;
- ; NOP ;
- ; NOP ;
- ; NOP ;
- ; NOP ;
- ; NOP ;
- ;-----------------------------------------------;
- ;
- DECFSZ Temp1, F ;
- GOTO $+2 ;
- RETURN ;
- NOP ;
- GOTO _CR_Next_Line ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Clear_Court: ;
- ;---------------------------------------------------;
- MOVLW LOW VIDEO_BUFFER_START ;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- MOVLW MAX_LINES * 4 ;
- MOVWF Temp1 ; 224 bytes
- _CC_IVB: ;
- MOVLW H'00' ;
- MOVWF INDF1 ;
- INCF FSR1L, F ;
- DECFSZ Temp1, F ;
- GOTO _CC_IVB ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- _Draw_Title: ;
- ;---------------------------------------------------;
- MOVLW LOW VIDEO_BUFFER_START + (15 * 4) ;
- MOVWF FSR1L ;
- MOVLW HIGH VIDEO_BUFFER_START ;
- MOVWF FSR1H ;
- MOVLW LOW PICPONG_TABLE ;
- MOVWF FSR0L ;
- MOVLW HIGH PICPONG_TABLE ;
- MOVWF FSR0H ;
- MOVLW PICPONG_TABLE_END - PICPONG_TABLE_START ;
- MOVWF Temp1 ;
- _DT_TITLE: ;
- MOVFW INDF0 ;
- MOVWF INDF1 ;
- ADDFSR FSR1, 1 ;
- ADDFSR FSR0, 1 ;
- DECFSZ Temp1, F ;
- GOTO _DT_TITLE ;
- RETURN ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; COPYRIGHT Scan Line Data ;
- ;---------------------------------------------------;
- COPYRIGHT_TABLE: ;
- ;---------------------------------------------------;
- DT B'00000000', B'00000011', B'00111011', B'10001001', B'00100111', B'00100010', B'11100000', B'00000000'
- DT B'00000000', B'00000011', B'10111011', B'10010011', B'10010111', B'01110110', B'11100000', B'00000000'
- DT B'00000000', B'00000010', B'10010001', B'00010010', B'10010001', B'01010010', B'00100000', B'00000000'
- DT B'10101010', B'10101010', B'10010001', B'00010010', B'00010111', B'01010010', B'11100101', B'01010101'
- DT B'10101010', B'10101010', B'10010001', B'00010010', B'00010111', B'01010010', B'11100101', B'01010101'
- DT B'00000000', B'00000010', B'10010001', B'00010010', B'10010100', B'01010010', B'10000000', B'00000000'
- DT B'00000000', B'00000011', B'10010011', B'10010011', B'10010111', B'01110010', B'11100000', B'00000000'
- DT B'00000000', B'00000011', B'00010011', B'10001001', B'00100111', B'00100010', B'11100000', B'00000000'
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ;USER_CODE_2 CODE H'800' ;
- ;---------------------------------------------------;
- ; Numeric Characters (0-9) Scan Line Data ;
- ;---------------------------------------------------;
- CHARACTER_TABLE: ;
- ;---------------------------------------------------;
- DT B'11101110', B'10101010', B'10101010', B'10101010', B'11101110'
- DT B'01000100', B'11001100', B'01000100', B'01000100', B'01000100'
- DT B'11101110', B'00100010', B'11101110', B'10001000', B'11101110'
- DT B'11101110', B'00100010', B'11101110', B'00100010', B'11101110'
- DT B'10101010', B'10101010', B'11101110', B'00100010', B'00100010'
- DT B'11101110', B'10001000', B'11101110', B'00100010', B'11101110'
- DT B'11101110', B'10001000', B'11101110', B'10101010', B'11101110'
- DT B'11101110', B'00100010', B'00100010', B'00100010', B'00100010'
- DT B'11101110', B'10101010', B'11101110', B'10101010', B'11101110'
- DT B'11101110', B'10101010', B'11101110', B'00100010', B'00100010'
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- ; PICPONG Title Scan Line Data ;
- ;---------------------------------------------------;
- PICPONG_TABLE: ;
- ;---------------------------------------------------;
- PICPONG_TABLE_START: ;
- DT B'00000000', B'00000000', B'00000000', B'00000000'
- DT B'00000000', B'00011001', B'01000000', B'00000000'
- DT B'00000000', B'00011101', B'11100000', B'00000000'
- DT B'00000000', B'00010100', B'10100000', B'00000000'
- DT B'00000000', B'00010100', B'10100000', B'00000000'
- DT B'00000000', B'00010101', B'10000000', B'00000000'
- DT B'00000000', B'00010101', B'10001000', B'00000000'
- DT B'00000000', B'00011101', B'10001000', B'00000000'
- DT B'00000000', B'00011001', B'10000000', B'00000000'
- DT B'00000000', B'00010001', B'10100000', B'00000000'
- DT B'00000000', B'00010001', B'10100000', B'00000000'
- DT B'00000000', B'00010001', B'11100000', B'00000000'
- DT B'00000000', B'00010001', B'01000000', B'00000000'
- DT B'00000000', B'00000000', B'00000000', B'00000000'
- DT B'00000000', B'00000000', B'00000000', B'00000000'
- DT B'00000000', B'01100010', B'01000100', B'00000000'
- DT B'00000000', B'01110111', B'11101110', B'00000000'
- DT B'00000000', B'01010101', B'10101010', B'00000000'
- DT B'00000000', B'01010101', B'10101010', B'00000000'
- DT B'00000000', B'01010101', B'10101010', B'00000000'
- DT B'00000000', B'01010101', B'10101010', B'00000000'
- DT B'00000000', B'01110101', B'10101110', B'00000000'
- DT B'00000000', B'01100101', B'10100110', B'00000000'
- DT B'00000000', B'01000101', B'10100010', B'00000000'
- DT B'00000000', B'01000101', B'10101010', B'00000000'
- DT B'00000000', B'01000111', B'10101110', B'00000000'
- DT B'00000000', B'01000010', B'10100100', B'00000000'
- DT B'00000000', B'00000000', B'00000000', B'00000000'
- PICPONG_TABLE_END: ;
- ;---------------------------------------------------;
- ;---------------------------------------------------;
- END ;
- ;---------------------------------------------------;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement