Advertisement
Guest User

PONG.ASM V4.00

a guest
Dec 26th, 2012
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 86.06 KB | None | 0 0
  1. ;---------------------------------------------------;
  2. ;---------------------------------------------------;
  3. ; Name: PONG.ASM ;
  4. ; Use: DTI's version of the PONG game ;
  5. ;---------------------------------------------------;
  6. ; Copyright: (C)2012 DTI ;
  7. ; Dysfunctional Technologies, Inc. ;
  8. ; All Rights Reserved ;
  9. ;---------------------------------------------------;
  10. ; Author: Timothy S. Carlson ;
  11. ; Dysfunctional Technologies, Inc. ;
  12. ; Date: December 24, 2012 ;
  13. ; Version: V4.00 ;
  14. ;---------------------------------------------------;
  15. ;---------------------------------------------------;
  16. ; WEBSITE: www.dysfunctionaltechnologies.com ;
  17. ; EMAIL: tscarlson@gmail.com ;
  18. ; ;
  19. ; You are welcome to use this code as you see fit, ;
  20. ; however - not to be used in for-profit products ;
  21. ; unless we have come to a monetary agreement. ;
  22. ; ;
  23. ; If this code is used, credit given is appreciated ;
  24. ;---------------------------------------------------;
  25. ;---------------------------------------------------;
  26. ; VERSION LOG: ;
  27. ; V3.00: Modified characters, character placement, ;
  28. ; and field to look more like the real PONG ;
  29. ; V3.01: Renamed to PIC-PONG ;
  30. ; - Added 64x224 mode for copyright message ;
  31. ; - Added piezo speaker for sounds ;
  32. ; - Added ball 'slow-down' method ;
  33. ; - Added special dot as court divider ;
  34. ; V3.02: Fixed my program memory page issues. ;
  35. ; - Revamped _Draw_Scores. Cleaner, faster. ;
  36. ; - Redid title - "PONG FOR THE 12F1840" ;
  37. ; - Added _DEBUG_ turns on/off GP2 VSYNC Pulse;
  38. ; - Moved some procs to high page: ;
  39. ; - _Draw_Title ;
  40. ; - _Clear_Court ;
  41. ; - _Copyright ;
  42. ; - _Initialize_System ;
  43. ; - More comments ;
  44. ; - Modified comments discussing the number of;
  45. ; lines, what they do, and how long (in ms) ;
  46. ; for a complete video frame. ;
  47. ; 260 lines * 64us each = 16.64ms per frame ;
  48. ; The current timing is ~16.645ms per frame ;
  49. ; - General Cleanup ;
  50. ; - Added the software version number at the ;
  51. ; bottom right of the screen, in the copy- ;
  52. ; right strip. ;
  53. ; V3.03: Updated version number display to V3.03 ;
  54. ; - Adding more comments ;
  55. ; - Changed references to 'Half_Line' and ;
  56. ; 'Full_Line' in some proc titles to ;
  57. ; '30us_Line' and '60us_Line' respectively. ;
  58. ; (_Blank_Half_Line => _Blank_30us_Line) ;
  59. ; - Moved some line generation procs to high ;
  60. ; page, added PAGESELs, adjusted timings. ;
  61. ; - _Blank_60us_Line ;
  62. ; - _Blank_30us_Line ;
  63. ; - _Special_30us_Line ;
  64. ; - _Inverted_30us_Line ;
  65. ; - Everything possible has been moved to the ;
  66. ; high page of memory, with the exceptions: ;
  67. ; - _Update_Paddle_1 ;
  68. ; - _Update_Paddle_2 ;
  69. ; - _Update_Ball ;
  70. ; I am only using 655 words in the low page ;
  71. ; of program memory now (H'000'-H'28E') out ;
  72. ; of 4096 bytes (2048 words). The high page ;
  73. ; is packed - H'800'-H'D92'. I left the ;
  74. ; above procs in the low page as I will be ;
  75. ; making modifications / enhancements to ;
  76. ; these routines in the near future. ;
  77. ; - NOTE: If you see what appears to be stray ;
  78. ; NOPs strewn about in the code - DON'T ;
  79. ; REMOVE THEM. They are there for video ;
  80. ; timings purposes. Remove them and DOOM! ;
  81. ; V3.04: Updated version number display to V3.04 ;
  82. ; - Changed the use of Timer0 (8bit) from ;
  83. ; loading zero and waiting for count to ;
  84. ; loading (inverse) count and waiting for ;
  85. ; overflow flag (TMR0IF) in INTCON. ;
  86. ; - Created _Clear_Items and _Draw_Items. ;
  87. ; _Clear_Items clears ball, paddles, scores ;
  88. ; _Draw_Items draws ball, paddles, scores ;
  89. ; - Removed _Update_Scores, since one half ;
  90. ; went into _Clear_Items and the other half ;
  91. ; went into _Draw_Items. There was nothing ;
  92. ; left, except for 60us line generation, ;
  93. ; after that. ;
  94. ; V3.05: Updated verion number display to V3.05 ;
  95. ; - Changed field size from 32x56 to 32x48 ;
  96. ; - Changed VIDEO_BUFFER start from H'2010' to;
  97. ; H'2020' to recover 16 bytes of data memory;
  98. ; that are now available due to small field ;
  99. ; - Added dynamic creation of blank lines ;
  100. ; depending on screen size. This will keep ;
  101. ; the screen centered (vertically) in the ;
  102. ; viewable area of the video frame and keep ;
  103. ; the video frame at 60hz ;
  104. ; - Added court sidelines so that the limits ;
  105. ; of the court can be easily determined no ;
  106. ; matter the size of the field. ;
  107. ; - Added 'SERVICE' markers (arrows next to ;
  108. ; the scores) to easily determine who's turn;
  109. ; it is to serve. Last one scored serves. ;
  110. ; - Reduced size of title screen and changed ;
  111. ; title back to just 'PONG'. Title screen ;
  112. ; was too large and the time to draw (or ;
  113. ; clear) was blowing WAY past the 60us limit;
  114. ; - Changed wall collision detection so that ;
  115. ; Ball_Dir_Y can be something other that 1 ;
  116. ; or -1. This opens the door to implementing;
  117. ; 'english' on the ball ;
  118. ; - Service is now done from the paddle, not ;
  119. ; center court. And the beginning Ball_Y ;
  120. ; position is centered with the paddle ;
  121. ; - Ball angle on service (Ball_Dir_Y at 1 or ;
  122. ; for the left paddle, -1 or -2 for the ;
  123. ; right paddle) depends on paddle position ;
  124. ; - The starting position of the scores has ;
  125. ; been dropped one line to keep the score ;
  126. ; display from bumping against the court ;
  127. ; side line. ;
  128. ; - With a field of 32x48, PONG has been ;
  129. ; testing on a Sony PS1 LCD monitor, a small;
  130. ; PHILIPS LCD TV, and a regular CRT TV which;
  131. ; all work well. However, a 32" Chinese made;
  132. ; LCD TV does not work - maybe because it ;
  133. ; wants 50hz? Any feedback on various TVs ;
  134. ; used with PONG would be appreciated. ;
  135. ; - Added a check to see if the left or right ;
  136. ; button is being held - this keeps from ;
  137. ; holding the button down and continuously ;
  138. ; serving the ball. ;
  139. ; - Even MORE comments added. I sure hope I ;
  140. ; remove all of the old (irrelevent) ones. ;
  141. ; - Back to the large graphics to the title. ;
  142. ; I split it into two 60us lines. Also did ;
  143. ; a lot of tricks to reduce the instruction ;
  144. ; count. _Clear_Screen replaces _Clear_Items;
  145. ; and will clear the screen OR display the ;
  146. ; title at the appropriate time. ;
  147. ; - EVERYTHING uses TIMER0 now, except for ;
  148. ; generating a positive 2us sync pulse. Not ;
  149. ; enough cycles to incorporate the timer. ;
  150. ; - All loose code and commented out lines ;
  151. ; removed. All timings at spec. RELEASE! ;
  152. ; V3.06: Updated verion number display to V3.06 ;
  153. ; - Corrected a few bugs in ball/paddle ;
  154. ; collision detection. ;
  155. ; - Corrected a bug in _Clear_Screen ;
  156. ; - Moved all 30us stuff to a procedure called;
  157. ; _Vertical_Sync. ;
  158. ; - Split the code as evenly as I could ;
  159. ; between the low page and high page of ;
  160. ; program memory. Lots of room for editing ;
  161. ; now without worrying about bumping the ;
  162. ; ceilings. There's around 900 program words;
  163. ; free in each page. ;
  164. ; - I don't think there are any major bugs - ;
  165. ; just enhancements waiting in the wings. ;
  166. ; Time to final release and move on! ;
  167. ; V3.07: Updated version number display to V3.07 ;
  168. ; - Added a blank line and then two white ;
  169. ; lines just after the copyright lines. Just;
  170. ; because I like it better. ;
  171. ; - Fixed the 'shoot off in a horitontal angle;
  172. ; when hitting the upper sideline wall' bug.;
  173. ; If you saw the V3.06 demo video, it was ;
  174. ; occurring frequently and the OCD in me ;
  175. ; said "You gotta fix that". ;
  176. ; That's it for this version - RELEASE! ;
  177. ; V4.00: Updated verion number display to V4.00 ;
  178. ; - Converting timings of video signal to ;
  179. ; TIMER0 Interrupt Service Routine. ;
  180. ; - Added a 'shake loose' of the PICKIT if ;
  181. ; attached. Without the 'shake loose', the ;
  182. ; PICKIT hold GPIO1 low, which is the RBUTT.;
  183. ;---------------------------------------------------;
  184. ;---------------------------------------------------;
  185.  
  186. ;---------------------------------------------------;
  187. ; Project Defines ;
  188. ;---------------------------------------------------;
  189. #DEFINE _PONG.ASM_ ;
  190. #DEFINE _MAIN_MODULE_ ;
  191. ;---------------------------------------------------;
  192. #DEFINE _DEBUG_ TRUE ;
  193. #DEFINE _USE_THUMBSTICKS_ TRUE ;
  194. ;---------------------------------------------------;
  195.  
  196. ;---------------------------------------------------;
  197. ; Includes ;
  198. ;---------------------------------------------------;
  199. ; This file has some common defines (TRUE, FALSE, ;
  200. ; etc.) used throughout the program. It also has the;
  201. ; CONFIGURATION_BITS settings for the PIC, which are;
  202. ; only processed in the module that has the define ;
  203. ; _MAIN_MODULE_. ;
  204. ;---------------------------------------------------;
  205. #INCLUDE Common.INC ;
  206. ;---------------------------------------------------;
  207.  
  208. ;---------------------------------------------------;
  209. ; Macros ;
  210. ;---------------------------------------------------;
  211. DELAY MACRO DTIME ;
  212. ;-----------------------------------------------;
  213. ; The time munger used EVERYWHERE ;
  214. ;-----------------------------------------------;
  215. MOVLW DTIME ;
  216. MOVWF DTemp ;
  217. DECFSZ DTemp, F ;
  218. GOTO $-1 ;
  219. ;-----------------------------------------------;
  220. ENDM ;
  221. ;
  222. DO_BIT MACRO THISBIT, NOPS ;
  223. ;-----------------------------------------------;
  224. ; Sets the DAC either WHITE or BLACK ;
  225. ; Does a specified delay in NOPs ;
  226. ;-----------------------------------------------;
  227. ; NOTE: This is used in the higher resolution ;
  228. ; COPYRIGHT lines and when generating the ;
  229. ; gameplay data lines. ;
  230. ;-----------------------------------------------;
  231. ; Note that a WHITE bit check is done first and ;
  232. ; then a BLACK bit check. If you reverse the ;
  233. ; order, things look a bit differently on the ;
  234. ; screen. That is because there is a two ;
  235. ; instruction delay between writing the bit in ;
  236. ; one state or in the other state. Reversing the;
  237. ; order (BLACK first, then WHITE) causes black ;
  238. ; 'gaps'. This order is most visually appealing,;
  239. ; at least to me. ;
  240. ;-----------------------------------------------;
  241. BTFSC INDF1, THISBIT ;
  242. BSF PORTA, VIDEO_0_BIT ;
  243. BTFSS INDF1, THISBIT ;
  244. BCF PORTA, VIDEO_0_BIT ;
  245. #IF NOPS > 0 ;
  246. NOP ;
  247. #ENDIF ;
  248. #IF NOPS > 1 ;
  249. NOP ;
  250. #ENDIF ;
  251. #IF NOPS > 2 ;
  252. NOP ;
  253. #ENDIF ;
  254. #IF NOPS > 3 ;
  255. NOP ;
  256. #ENDIF ;
  257. #IF NOPS > 4 ;
  258. NOP ;
  259. #ENDIF ;
  260. #IF NOPS > 5 ;
  261. NOP ;
  262. #ENDIF ;
  263. #IF NOPS > 6 ;
  264. NOP ;
  265. #ENDIF ;
  266. #IF NOPS > 7 ;
  267. NOP ;
  268. #ENDIF ;
  269. #IF NOPS > 8 ;
  270. NOP ;
  271. #ENDIF ;
  272. #IF NOPS > 9 ;
  273. NOP ;
  274. #ENDIF ;
  275. ;-----------------------------------------------;
  276. ENDM ;
  277. ;
  278. SET_DAC2BIT MACRO COLOR ;
  279. ;-----------------------------------------------;
  280. ; Sets the 2bit DAC to the desired color ;
  281. ; Both bits are done at once, or else some weird;
  282. ; transitions on the DAC can be seen. Okay if ;
  283. ; just colors (WHITE, GRAY, BLACK), but if a ;
  284. ; sync pulse shows up out context, it can really;
  285. ; mess up the video timings ;
  286. ;-----------------------------------------------;
  287. MOVFW PORTA ;
  288. ANDLW ~(VIDEO_0 | VIDEO_1) ;
  289. IORLW COLOR ;
  290. MOVWF PORTA ;
  291. ;-----------------------------------------------;
  292. ENDM ;
  293. ;
  294. AUDIO_PROC MACRO ;
  295. ;-----------------------------------------------;
  296. ; This handles the sound generation during the ;
  297. ; game. Sounds are produced by toggling GPIO1 ;
  298. ; at the end of each 60us line - if it is ;
  299. ; toggled during ALL 60us lines, you get a high ;
  300. ; frequency (around 7800hz). If every other 60us;
  301. ; line, the frequency is around lower. This ;
  302. ; procedure is NOT run during VERTICAL SYNC time;
  303. ; to keep AUDIO from altering the timings of the;
  304. ; video, causing distortions of the image on the;
  305. ; screen. ;
  306. ;-----------------------------------------------;
  307. BTFSC System_Status, VERTICAL_SYNC_BIT ;
  308. GOTO $+15 ;
  309. BTFSS System_Status, BUZZ_BIT ;
  310. GOTO $+13 ;
  311. DECFSZ Buzz_Count, F ;
  312. GOTO $+11 ;
  313. MOVFW Buzz_Reload ;
  314. MOVWF Buzz_Count ;
  315. MOVLW AUDIO ;
  316. XORWF PORTA, F ;
  317. DECFSZ Buzz_Dur_LO, F ;
  318. GOTO $+5 ;
  319. DECFSZ Buzz_Dur_HI, F ;
  320. GOTO $+3 ;
  321. BCF System_Status, BUZZ_BIT ;
  322. BSF PORTA, AUDIO_BIT ;
  323. ;-----------------------------------------------;
  324. ENDM ;
  325. ;
  326. #DEFINE SIG_2US 2 ;
  327. #DEFINE SIG_4US 4 ;
  328. #DEFINE SIG_30US 30 ;
  329. #DEFINE SIG_60US 60 ;
  330. ;
  331. START_TIMING MACRO SIG_1_LEN, SIG_2_LEN ;
  332. AUDIO_PROC ;
  333. ;
  334. BTFSC PORTA, VIDEO_1_BIT ;
  335. GOTO $-1 ;
  336. ;
  337. #IF (SIG_1_LEN == 2) ;
  338. MOVLW ~((SIG_1_LEN*2)-0) ;
  339. #ENDIF ;
  340. #IF (SIG_1_LEN == 4) ;
  341. MOVLW ~((SIG_1_LEN*3)-1) ;
  342. #ENDIF ;
  343. #IF (SIG_1_LEN == 30) ;
  344. MOVLW ~((SIG_1_LEN*4)-5) ;
  345. #ENDIF ;
  346. #IF (SIG_1_LEN == 60) ;
  347. MOVLW ~((SIG_1_LEN*4)-5) ;
  348. #ENDIF ;
  349. ;
  350. MOVWF Next_Vid_Timing ;
  351. ;
  352. BTFSS PORTA, VIDEO_1_BIT ;
  353. GOTO $-1 ;
  354. ;
  355. #IF (SIG_2_LEN == 2) ;
  356. MOVLW ~((SIG_2_LEN*2)-0) ;
  357. #ENDIF ;
  358. #IF (SIG_2_LEN == 4) ;
  359. MOVLW ~((SIG_2_LEN*3)-1) ;
  360. #ENDIF ;
  361. #IF (SIG_2_LEN == 30) ;
  362. MOVLW ~((SIG_2_LEN*4)-5) ;
  363. #ENDIF ;
  364. #IF (SIG_2_LEN == 60) ;
  365. MOVLW ~((SIG_2_LEN*4)-5) ;
  366. #ENDIF ;
  367. ;
  368. MOVWF Next_Vid_Timing ;
  369. ;-----------------------------------------------;
  370. ENDM ;
  371. ;
  372. PLAY_SOUND MACRO FREQUENCY, DURATION ;
  373. ;-----------------------------------------------;
  374. ; This will play a sound of a specified ;
  375. ; frequency for a specified duration ;
  376. ; The lower the frequency number, the higher ;
  377. ; the frequency. Duration is also a function ;
  378. ; of the frequency number, so if frequency goes ;
  379. ; up, adjust the duration down. ;
  380. ;-----------------------------------------------;
  381. ; Sound is played during 4us HORIZONTAL SYNC ;
  382. ; times of the video signal. There is a short ;
  383. ; period during VERTICAL SYNC where nothing is ;
  384. ; done with sound because there ARE no 4us ;
  385. ; HSYNCs. There are 2us HSYNCs during VSYNC, but;
  386. ; there isn't enough time to process the sound ;
  387. ; code without stretching out the 2us HSYNCs ;
  388. ; beyond 2us, and that will mess up the video ;
  389. ; timings. The total time between the last 4us ;
  390. ; HSYNC before VSYNC and the first 4us HSYNC ;
  391. ; after VSYNC is only ~512us, so it's barely ;
  392. ; noticable. After all, it's only a game... ;
  393. ;-----------------------------------------------;
  394. ; NOTE that a FREQUENCY of 0 is treated as a ;
  395. ; frequency of 256. 0<=Freq<=255. The count is ;
  396. ; decremented BEFORE it is checked to be 0, so ;
  397. ; starting with 0 will dec, see 255, continue ;
  398. ; loop. Just so you are warned. ;
  399. ;-----------------------------------------------;
  400. MOVLW FREQUENCY ;
  401. MOVWF Buzz_Count ;
  402. MOVWF Buzz_Reload ;
  403. MOVLW LOW DURATION ;
  404. MOVWF Buzz_Dur_LO ;
  405. MOVLW HIGH DURATION ;
  406. MOVWF Buzz_Dur_HI ;
  407. BSF System_Status, BUZZ_BIT ;
  408. ;-----------------------------------------------;
  409. ENDM ;
  410. ;---------------------------------------------------;
  411.  
  412. ;---------------------------------------------------;
  413. ; Defines ;
  414. ;---------------------------------------------------;
  415. ; You have to chose between using all buttons, ;
  416. ; or using a thumbstick with a button. I might ;
  417. ; be able to figure out a way to automatically ;
  418. ; determine which is connected, but for now you ;
  419. ; will just have to decide which you want, set ;
  420. ; _USE_THUMBSTICKS_ to either TRUE or FALSE, and;
  421. ; re-compile the project. ;
  422. ;-----------------------------------------------;
  423. #IF _USE_THUMBSTICKS_ ;
  424. #DEFINE RJOY H'01' ; Right THUMBSTICK
  425. #DEFINE RJOY_BIT 0 ; GPIO 0 - PIN 7
  426. #DEFINE AUDIO H'02' ; Audio Output when set to OUTPUT
  427. #DEFINE AUDIO_BIT 1 ; GPIO 1 - PIN 6
  428. #DEFINE RBUTT H'02' ; Right BUTTON when set to INPUT
  429. #DEFINE RBUTT_BIT 1 ; GPIO 1 - PIN 6
  430. #DEFINE LJOY H'04' ; Left THUMBSTICK
  431. #DEFINE LJOY_BIT 2 ; GPIO 2 - PIN 5
  432. #DEFINE LBUTT H'08' ; Left BUTTON
  433. #DEFINE LBUTT_BIT 3 ; GPIO 3 - PIN 4
  434. #ELSE ;!_USE_THUMBSTICKS_ ;
  435. #DEFINE RBUTT_1 H'01' ; Right BUTTON 1
  436. #DEFINE RBUTT_1_BIT 0 ; GPIO 0 - PIN 7
  437. #DEFINE RBUTT_2 H'02' ; Right BUTTON 2
  438. #DEFINE RBUTT_2_BIT 1 ; GPIO 1 - PIN 6
  439. #DEFINE LBUTT_2 H'04' ; Left BUTTON 2
  440. #DEFINE LBUTT_2_BIT 2 ; GPIO 2 - PIN 5
  441. #DEFINE LBUTT_1 H'08' ; Left BUTTON 1
  442. #DEFINE LBUTT_1_BIT 3 ; GPIO 3 - PIN 4
  443. #ENDIF ;_USE_THUMBSTICKS_ ;
  444. ;-----------------------------------------------;
  445. ;
  446. ;-----------------------------------------------;
  447. ; 2bit DAC definitions. The 2bit DAC is just a ;
  448. ; pair of resistors on two GPIOs, which feeds ;
  449. ; the VIDEO out. ;
  450. ;-----------------------------------------------;
  451. #DEFINE VIDEO_1 H'10' ; 1K ohm
  452. #DEFINE VIDEO_1_BIT 4 ; GPIO 5 - PIN 2
  453. #DEFINE VIDEO_0 H'20' ; 470 ohm
  454. #DEFINE VIDEO_0_BIT 5 ; GPIO 4 - PIN 3
  455. ;
  456. #DEFINE COLOR_WHITE (VIDEO_0 + VIDEO_1) ;
  457. #DEFINE COLOR_BLACK VIDEO_1 ;
  458. #DEFINE COLOR_GRAY VIDEO_0 ;
  459. #DEFINE COLOR_SYNC 0 ;
  460. ;-----------------------------------------------;
  461. ;
  462. ;-----------------------------------------------;
  463. ; There are 224 lines created during _Data_Lines;
  464. ; However, because of memory limitations, I ;
  465. ; cannot allocate enough memory for the video ;
  466. ; buffer. So - I do have enough memory for 56 ;
  467. ; lines - 1/4 of 224 - so we display each line ;
  468. ; of data 4 times. ;
  469. ;-----------------------------------------------;
  470. #DEFINE MAX_LINES 56 ; DON'T EXCEED 56
  471. ;-----------------------------------------------;
  472. ; Make certain NUM_LINES is an even number so ;
  473. ; all of the math works out properly. Make sure ;
  474. ; NOT to exceed the MAX_LINES value. And don't ;
  475. ; change NUM_LINES for less than 9 - that's the ;
  476. ; paddle height, so that will probably break it.;
  477. ; But then - the paddle height is adjustable ;
  478. ; with just changing a define (below), so - who ;
  479. ; knows! ;
  480. ;-----------------------------------------------;
  481. #DEFINE NUM_LINES 48 ; DON'T EXCEED 48
  482. ;-----------------------------------------------;
  483. ;
  484. ;-----------------------------------------------;
  485. ; This is my method of making the game easier or;
  486. ; harder - either I update and draw the ball ;
  487. ; every frame (fast ball), or every other frame ;
  488. ; (not as fast), or every 3rd frame (normal ;
  489. ; ball) or higher for slower. Set MAX_BALL_WAIT ;
  490. ; to the desired speed (1=fast, 2=not as fast, ;
  491. ; 3=normal, 4=slower, etc.). This is hardcoded ;
  492. ; right now, a change requires a recompile. I ;
  493. ; have plans to allocate another precious byte ;
  494. ; of data memory so that the ball speed can be ;
  495. ; changed by a menu item. ;
  496. ;-----------------------------------------------;
  497. #DEFINE DRAW_BALL_BIT 0 ;
  498. #DEFINE MAX_BALL_WAIT 3 ;
  499. ;
  500. ;-----------------------------------------------;
  501. ; Just a bunch of hardcoded starting points, ;
  502. ; sizes, and bit-munching stuff for the various ;
  503. ; graphics. ;
  504. ;-----------------------------------------------;
  505. ; I use the PIC's LINEAR MEMORY scheme to create;
  506. ; a contiguous video buffer. Grab the MicroChip ;
  507. ; documentation and read up. Then go search on ;
  508. ; the web for some docs that will really explain;
  509. ; it for you. ;
  510. ;-----------------------------------------------;
  511. #DEFINE VIDEO_BUFFER_START H'2030' ;
  512. #DEFINE FIELD_HEIGHT NUM_LINES ;
  513. #DEFINE FIELD_WIDTH 32 ;
  514. #DEFINE LEFT_SCORE_START H'01' ;
  515. #DEFINE RIGHT_SCORE_START H'02' ;
  516. #DEFINE LEFT_PADDLE_START H'00' ;
  517. #DEFINE LEFT_PADDLE_BIT H'40' ;
  518. #DEFINE LEFT_PADDLE_MASK H'BF' ;
  519. #DEFINE RIGHT_PADDLE_START H'03' ;
  520. #DEFINE RIGHT_PADDLE_BIT H'02' ;
  521. #DEFINE RIGHT_PADDLE_MASK H'FD' ;
  522. #DEFINE PADDLE_HEIGHT 9 ;
  523. #DEFINE BALL_HEIGHT 3 ;
  524. #DEFINE SERVICE_1_START H'04' ;
  525. #DEFINE SERVICE_2_START H'07' ;
  526. ;---------------------------------------------------;
  527.  
  528. ;---------------------------------------------------;
  529. ;---------------------------------------------------;
  530. USER_DATA_1 UDATA H'020' ;
  531. ;---------------------------------------------------;
  532. Ball_X res 1 ; 20
  533. Ball_Y res 1 ; 21
  534. Ball_Dir_X res 1 ; 22
  535. Ball_Dir_Y res 1 ; 23
  536. Paddle_1_Y res 1 ; 24
  537. Paddle_2_Y res 1 ; 25
  538. Score_1 res 1 ; 26
  539. Score_2 res 1 ; 27
  540. Ball_Wait res 1 ; 28
  541. ;---------------------------------------------------;
  542. ; Bit definitions for System_Status ;
  543. ;---------------------------------------------------;
  544. #DEFINE BUZZ H'01' ;
  545. #DEFINE BUZZ_BIT 0 ;
  546. #DEFINE P1_SERVICE H'02' ;
  547. #DEFINE P1_SERVICE_BIT 1 ;
  548. #DEFINE P2_SERVICE H'04' ;
  549. #DEFINE P2_SERVICE_BIT 2 ;
  550. #DEFINE P1_PRESSED H'08' ;
  551. #DEFINE P1_PRESSED_BIT 3 ;
  552. #DEFINE P2_PRESSED H'10' ;
  553. #DEFINE P2_PRESSED_BIT 4 ;
  554. #DEFINE VERTICAL_SYNC H'20' ;
  555. #DEFINE VERTICAL_SYNC_BIT 5 ;
  556. ;---------------------------------------------------;
  557. System_Status res 1 ; 29
  558. Buzz_Count res 1 ; 2A
  559. Buzz_Reload res 1 ; 2B
  560. Buzz_Dur_HI res 1 ; 2C
  561. Buzz_Dur_LO res 1 ; 2D
  562. ;---------------------------------------------------;
  563. ; Consume Left_Overs / Smaller_Screen for your data ;
  564. ; variables as need. LO/SS is just here to pad to ;
  565. ; push Video_Buffer1 to the proper spot. ;
  566. Left_Overs res 2 ; 2E-2F
  567. ;---------------------------------------------------;
  568. ; Only 6 bytes left - 2A-2F ;
  569. ;---------------------------------------------------;
  570. Smaller_Screen res 32 ; 30-4F
  571. ;---------------------------------------------------;
  572. ; I've pushed the VIDEO_BUFFER to H'2020', since the;
  573. ; field has become smaller (32x48 vs 32x56). The ;
  574. ; required size of the VIDEO_BUFFER is also less, so;
  575. ; this will give up 24 more bytes of data memory for;
  576. ; use in game programming. ;
  577. ;---------------------------------------------------;
  578. ; 16 additional bytes left (smaller screen) - 30-3F ;
  579. ;---------------------------------------------------;
  580. ; We don't access the Video_BufferX arrays directly,;
  581. ; we use LINEAR PAGE memory through the FSR register;
  582. ; LINEAR PAGE memory groups the data memory at 0x20,;
  583. ; 0xA0, and Ox120 into a contiguous linear page. ;
  584. ; Note that the shared memory (at the top 16 bytes ;
  585. ; of each page) is NOT included in the LINEAR PAGE ;
  586. ; memory mapping. ;
  587. ;---------------------------------------------------;
  588. ; MEMORY MAP - LINEAR PAGE MEMORY - 240 bytes total ;
  589. ; 0x2000-0x204F - 0x020-0x06F 80 bytes ;
  590. ; 0x2050-0x20BF - 0x0A0-0x0EF 80 bytes ;
  591. ; 0x20A0-0x20EF - 0x120-0x16F 80 bytes ;
  592. ;---------------------------------------------------;
  593. ; Since out max lines (now) is 48, we need 48x8 ;
  594. ; (192) bytes of memory for the screen buffer. This ;
  595. ; leaves us with 48 bytes of data memory for program;
  596. ; variables, plus the 16 in shared memory for 64! ;
  597. ;---------------------------------------------------;
  598. Video_Buffer1 res 32 ; 50-6F
  599. ;---------------------------------------------------;
  600. ;---------------------------------------------------;
  601.  
  602. ;---------------------------------------------------;
  603. ;---------------------------------------------------;
  604. USER_DATA_2 UDATA H'0A0' ;
  605. ;---------------------------------------------------;
  606. Video_Buffer2 res 80 ; A0-EF
  607. ;---------------------------------------------------;
  608. ;---------------------------------------------------;
  609.  
  610. ;---------------------------------------------------;
  611. ;---------------------------------------------------;
  612. USER_DATA_3 UDATA H'120' ;
  613. ;---------------------------------------------------;
  614. Video_Buffer3 res 80 ; 120-6F
  615. ;---------------------------------------------------;
  616. ;---------------------------------------------------;
  617.  
  618. ;---------------------------------------------------;
  619. ;---------------------------------------------------;
  620. USER_DATA_S UDATA_SHR H'070' ;
  621. ;---------------------------------------------------;
  622. Temp1 res 1 ; 70
  623. Temp2 res 1 ; 71
  624. DTemp res 1 ; 72
  625. DL_Count res 1 ; 73
  626. Line_Data res 4 ; 74-77
  627. Line_Count res 1 ; 78
  628. Repeat_Count res 1 ; 79
  629. Vid_Timing res 1 ; 7A
  630. Next_Vid_Timing res 1 ; 7B
  631. ;---------------------------------------------------;
  632. ; Only 4 bytes left! - 7C-7F ;
  633. ;---------------------------------------------------;
  634. ;---------------------------------------------------;
  635.  
  636. ;---------------------------------------------------;
  637. ;---------------------------------------------------;
  638. ; Reset Vector Code - Entry point from reset ;
  639. ;---------------------------------------------------;
  640. RESET_VECT CODE H'000' ;
  641. ;---------------------------------------------------;
  642. ; Initialize the hardware and memory elements. ;
  643. ; This is a FAR CALL to a proc in the high ;
  644. ; page of Program Memory, so it needs the ;
  645. ; PAGESEL before and after the CALL to properly ;
  646. ; set the upper 2 bits in the program counter. ;
  647. ; I am slowly converting ALL CALLs (and some ;
  648. ; GOTOs) to having PAGESEL before and after, but;
  649. ; the added instruction cycles mess up the video;
  650. ; timings in some spots. To be done slowly and ;
  651. ; surely. ;
  652. ;-----------------------------------------------;
  653. PAGESEL _Initialize_System ;
  654. GOTO _Initialize_System ;
  655. NOP ;
  656. NOP ;
  657. ;---------------------------------------------------;
  658. ;---------------------------------------------------;
  659.  
  660. ;---------------------------------------------------;
  661. ;---------------------------------------------------;
  662. ; Interrupt Vector Code ;
  663. ;---------------------------------------------------;
  664. INT_VECT CODE H'004' ;
  665. ;---------------------------------------------------;
  666. _IV_Entry: ;
  667. ;-----------------------------------------------;
  668. ; Toggle the BLACK/SYNC bit ;
  669. ;-----------------------------------------------;
  670. MOVLW VIDEO_1 ;
  671. XORWF PORTA, F ;
  672. ;-----------------------------------------------;
  673. ;
  674. ;-----------------------------------------------;
  675. ; Load current timing into TMR0, load next ;
  676. ; timing into current timing. ;
  677. ;-----------------------------------------------;
  678. MOVFW Vid_Timing ;
  679. MOVWF TMR0 ;
  680. MOVFW Next_Vid_Timing ;
  681. MOVWF Vid_Timing ;
  682. ;-----------------------------------------------;
  683. _IV_Exit: ;
  684. BCF INTCON, TMR0IF ;
  685. RETFIE ;
  686. ;---------------------------------------------------;
  687. ;---------------------------------------------------;
  688.  
  689. ;---------------------------------------------------;
  690. ;---------------------------------------------------;
  691. ; User Code in the low page of Program Memory ;
  692. ; More user code (USER_CODE_2) can be found in the ;
  693. ; high page of Program Memory, starting at H'800' ;
  694. ;---------------------------------------------------;
  695. USER_CODE_1 CODE H'00C' ;
  696. ;---------------------------------------------------;
  697.  
  698. ;---------------------------------------------------;
  699. _Update_Paddles: ;
  700. ;---------------------------------------------------;
  701. ; 60us BLACK line ;
  702. ;-----------------------------------------------;
  703. PAGESEL _Black_Line_60us ;
  704. CALL _Black_Line_60us ;
  705. PAGESEL $ ;
  706. ;-----------------------------------------------;
  707. ;
  708. #IF _USE_THUMBSTICKS_ ;
  709. _UP1_Update: ;
  710. ;-----------------------------------------------;
  711. ; ADC Magic (Channel 0) ;
  712. ;-----------------------------------------------;
  713. BANKSEL ADCON1 ;
  714. MOVLW H'60' ; Left Justified
  715. MOVWF ADCON1 ; FOSC/64, VREF
  716. MOVLW B'00001011' ; AN2, ADC GO, ADC On
  717. MOVWF ADCON0 ;
  718. BTFSC ADCON0, GO ; Wait for conversion
  719. GOTO $-1 ;
  720. MOVFW ADRESH ; Get result
  721. BANKSEL MEMORY ;
  722. ;-----------------------------------------------;
  723. ;
  724. MOVWF Temp1 ;
  725. MOVLW H'60' ;
  726. SUBWF Temp1, W ;
  727. BTFSS STATUS, C ;
  728. DECF Paddle_1_Y, F ;
  729. MOVLW H'9F' ;
  730. SUBWF Temp1, W ;
  731. BTFSC STATUS, C ;
  732. INCF Paddle_1_Y, F ;
  733. BTFSC Paddle_1_Y, MSB ;
  734. CLRF Paddle_1_Y ;
  735. MOVLW NUM_LINES - PADDLE_HEIGHT ;
  736. SUBWF Paddle_1_Y, W ;
  737. BTFSS STATUS, C ;
  738. GOTO _UP1_Update_Done ;
  739. MOVLW NUM_LINES - PADDLE_HEIGHT ;
  740. MOVWF Paddle_1_Y ;
  741. _UP1_Update_Done: ;
  742. #ELSE ;!_USE_THUMBSTICKS_ ;
  743. _UP1_Check_Up: ;
  744. CLRW ;
  745. XORWF Paddle_1_Y, W ;
  746. BTFSC STATUS, Z ;
  747. GOTO _UP1_Check_Down ;
  748. BTFSS PORTA, LBUTT_1_BIT ;
  749. DECF Paddle_1_Y, F ;
  750. _UP1_Check_Down: ;
  751. MOVLW NUM_LINES - PADDLE_HEIGHT ;
  752. XORWF Paddle_1_Y, W ;
  753. BTFSC STATUS, Z ;
  754. GOTO _UP1_Draw_Paddle ;
  755. BTFSS PORTA, LBUTT_2_BIT ;
  756. INCF Paddle_1_Y, F ;
  757. #ENDIF ;_USE_THUMBSTICKS_ ;
  758. ;
  759. #IF _USE_THUMBSTICKS_ ;
  760. _UP2_Update: ;
  761. ;-----------------------------------------------;
  762. ; ADC Magic (Channel 0) ;
  763. ;-----------------------------------------------;
  764. BANKSEL ADCON1 ;
  765. MOVLW H'60' ; Left Justified
  766. MOVWF ADCON1 ; FOSC/64, VREF
  767. MOVLW B'00000011' ; AN0, ADC GO, ADC On
  768. MOVWF ADCON0 ;
  769. BTFSC ADCON0, GO ; Wait for conversion
  770. GOTO $-1 ;
  771. MOVFW ADRESH ; Get result
  772. BANKSEL MEMORY ;
  773. ;-----------------------------------------------;
  774. ;
  775. MOVWF Temp1 ;
  776. MOVLW H'60' ;
  777. SUBWF Temp1, W ;
  778. BTFSS STATUS, C ;
  779. DECF Paddle_2_Y, F ;
  780. MOVLW H'9F' ;
  781. SUBWF Temp1, W ;
  782. BTFSC STATUS, C ;
  783. INCF Paddle_2_Y, F ;
  784. BTFSC Paddle_2_Y, MSB ;
  785. CLRF Paddle_2_Y ;
  786. MOVLW NUM_LINES - PADDLE_HEIGHT ;
  787. SUBWF Paddle_2_Y, W ;
  788. BTFSS STATUS, C ;
  789. GOTO _UP2_Update_Done ;
  790. MOVLW NUM_LINES - PADDLE_HEIGHT ;
  791. MOVWF Paddle_2_Y ;
  792. _UP2_Update_Done: ;
  793. #ELSE ;!_USE_THUMBSTICKS_ ;
  794. _UP2_Check_Up: ;
  795. CLRW ;
  796. XORWF Paddle_2_Y, W ;
  797. BTFSC STATUS, Z ;
  798. GOTO _UP2_Check_Down ;
  799. BTFSS PORTA, RBUTT_1_BIT ;
  800. DECF Paddle_2_Y, F ;
  801. _UP2_Check_Down: ;
  802. MOVLW NUM_LINES - PADDLE_HEIGHT ;
  803. XORWF Paddle_2_Y, W ;
  804. BTFSC STATUS, Z ;
  805. GOTO _UP2_Draw_Paddle ;
  806. BTFSS PORTA, RBUTT_2_BIT ;
  807. INCF Paddle_2_Y, F ;
  808. #ENDIF ;_USE_THUMBSTICKS_ ;
  809. ;
  810. RETURN ;
  811. ;---------------------------------------------------;
  812.  
  813. ;---------------------------------------------------;
  814. _Update_Ball: ;
  815. ;---------------------------------------------------;
  816. ; 60us BLACK line ;
  817. ;-----------------------------------------------;
  818. PAGESEL _Black_Line_60us ;
  819. CALL _Black_Line_60us ;
  820. PAGESEL $ ;
  821. ;
  822. _UB_Check_Wait: ;
  823. ;-----------------------------------------------;
  824. ; This is the delay so the ball isn't so fast ;
  825. ;-----------------------------------------------;
  826. DECFSZ Ball_Wait, F ;
  827. GOTO _UB_Exit ;
  828. ;
  829. MOVLW MAX_BALL_WAIT ;
  830. MOVWF Ball_Wait ;
  831. ;-----------------------------------------------;
  832. ;
  833. ;-----------------------------------------------;
  834. ; Is the ball moving? (Ball_Dir_X or Ball_Dir_Y ;
  835. ; not equal to zero?) If so, update the ball ;
  836. ; position. Otherwise, check for serve. ;
  837. ;-----------------------------------------------;
  838. CLRW ;
  839. XORWF Ball_Dir_X, W ;
  840. BTFSS STATUS, Z ;
  841. GOTO _UB_Update_Ball_X ;
  842. CLRW ;
  843. XORWF Ball_Dir_Y, W ;
  844. BTFSS STATUS, Z ;
  845. GOTO _UB_Update_Ball_X ;
  846. ;-----------------------------------------------;
  847. ;
  848. ;-----------------------------------------------;
  849. ; Check if left player pushed button to serve ;
  850. ;-----------------------------------------------;
  851. _UB_Check_L_Serve: ;
  852. BTFSS System_Status, P1_SERVICE_BIT ;
  853. GOTO _UB_Check_R_Serve ;
  854. BTFSC PORTA, LBUTT_BIT ;
  855. GOTO _UB_Check_L_Unpressed ;
  856. BTFSC System_Status, P1_PRESSED_BIT ;
  857. GOTO _UB_Check_R_Serve ;
  858. BSF System_Status, P1_PRESSED_BIT ;
  859. BCF System_Status, P1_SERVICE_BIT ;
  860. BCF System_Status, P2_SERVICE_BIT ;
  861. MOVLW 1 ;
  862. MOVWF Ball_Dir_X ;
  863. MOVFW Paddle_1_Y ;
  864. ADDLW PADDLE_HEIGHT / 2 ;
  865. SUBLW NUM_LINES / 2 ;
  866. MOVLW -2 ;
  867. BTFSC STATUS, C ;
  868. MOVLW 1 ;
  869. MOVWF Ball_Dir_Y ;
  870. MOVLW 2 ;
  871. MOVWF Ball_X ;
  872. MOVFW Paddle_1_Y ;
  873. ADDLW PADDLE_HEIGHT / 2 ;
  874. MOVWF Ball_Y ;
  875. GOTO _UB_Service ;
  876. _UB_Check_L_Unpressed: ;
  877. BCF System_Status, P1_PRESSED_BIT ;
  878. ;-----------------------------------------------;
  879. ;
  880. ;-----------------------------------------------;
  881. ; Check if right player pushed button to serve ;
  882. ;-----------------------------------------------;
  883. _UB_Check_R_Serve: ;
  884. BTFSS System_Status, P2_SERVICE_BIT ;
  885. GOTO _UB_Exit ;
  886. BTFSC System_Status, BUZZ_BIT ;
  887. GOTO _UB_Exit ;
  888. BANKSEL TRISA ;
  889. BSF TRISA, RBUTT_BIT ; Set as input (for BUTTON)
  890. BANKSEL PORTA ;
  891. BTFSC PORTA, RBUTT_BIT ;
  892. GOTO _UB_Check_R_Unpressed ;
  893. BANKSEL TRISA ;
  894. BCF TRISA, RBUTT_BIT ; Set as output (for AUDIO)
  895. BANKSEL MEMORY ;
  896. BTFSC System_Status, P2_PRESSED_BIT ;
  897. GOTO _UB_Exit ;
  898. BANKSEL TRISA ;
  899. BCF TRISA, RBUTT_BIT ; Set as output (for AUDIO)
  900. BANKSEL MEMORY ;
  901. BSF System_Status, P2_PRESSED_BIT ;
  902. BCF System_Status, P1_SERVICE_BIT ;
  903. BCF System_Status, P2_SERVICE_BIT ;
  904. MOVLW -1 ;
  905. MOVWF Ball_Dir_X ;
  906. MOVFW Paddle_2_Y ;
  907. ADDLW PADDLE_HEIGHT / 2 ;
  908. SUBLW NUM_LINES / 2 ;
  909. MOVLW -1 ;
  910. BTFSC STATUS, C ;
  911. MOVLW 2 ;
  912. MOVWF Ball_Dir_Y ;
  913. MOVLW 29 ;
  914. MOVWF Ball_X ;
  915. MOVFW Paddle_2_Y ;
  916. ADDLW PADDLE_HEIGHT / 2 ;
  917. MOVWF Ball_Y ;
  918. GOTO _UB_Service ;
  919. _UB_Check_R_Unpressed: ;
  920. BCF System_Status, P2_PRESSED_BIT ;
  921. GOTO _UB_Exit ;
  922. ;-----------------------------------------------;
  923. ;
  924. ;-----------------------------------------------;
  925. _UB_Service: ;
  926. MOVLW H'11' ;
  927. XORWF Score_1, W ;
  928. BTFSC STATUS, Z ;
  929. GOTO $+5 ;
  930. MOVLW H'11' ;
  931. XORWF Score_2, W ;
  932. BTFSS STATUS, Z ;
  933. GOTO _UB_Exit ;
  934. CLRF Score_1 ;
  935. CLRF Score_2 ;
  936. GOTO _UB_Exit ;
  937. ;-----------------------------------------------;
  938. ;
  939. ;-----------------------------------------------;
  940. _UB_Update_Ball_X: ;
  941. MOVFW Ball_Dir_X ; Update Ball X Position
  942. ADDWF Ball_X, F ;
  943. ;-----------------------------------------------;
  944. ;
  945. ;-----------------------------------------------;
  946. _UB_Update_Ball_X_Min: ;
  947. MOVLW 0 ;
  948. XORWF Ball_X, W ;
  949. BTFSS STATUS, Z ;
  950. GOTO _UB_Update_Ball_X_Max ;
  951. MOVLW 1 ;
  952. MOVWF Ball_Dir_X ;
  953. ;
  954. INCF Score_2, F ;
  955. PLAY_SOUND 24, H'017F' ; Frequency, Duration
  956. BCF System_Status, P1_SERVICE_BIT ;
  957. BSF System_Status, P2_SERVICE_BIT ;
  958. MOVLW 0 ;
  959. MOVWF Ball_Dir_X ;
  960. MOVWF Ball_Dir_Y ;
  961. MOVLW 15 ;
  962. MOVWF Ball_X ;
  963. MOVLW 27 ;
  964. MOVWF Ball_Y ;
  965. MOVFW Score_2 ;
  966. ANDLW H'0F' ;
  967. XORLW H'0A' ;
  968. BTFSS STATUS, Z ;
  969. GOTO _UB_BXMin_Exit ;
  970. MOVFW Score_2 ;
  971. ANDLW H'F0' ;
  972. ADDLW H'10' ;
  973. MOVWF Score_2 ;
  974. MOVLW H'A0' ;
  975. XORWF Score_2, W ;
  976. BTFSC STATUS, Z ;
  977. CLRF Score_2 ;
  978. _UB_BXMin_Exit: ;
  979. MOVLW H'11' ;
  980. XORWF Score_2, W ;
  981. BTFSS STATUS, Z ;
  982. GOTO _UB_Exit ;
  983. BSF System_Status, P1_SERVICE_BIT ;
  984. BSF System_Status, P2_SERVICE_BIT ;
  985. GOTO _UB_Exit ;
  986. ;-----------------------------------------------;
  987. ;
  988. ;-----------------------------------------------;
  989. _UB_Update_Ball_X_Max: ;
  990. MOVLW 31 ;
  991. XORWF Ball_X, W ;
  992. BTFSS STATUS, Z ;
  993. GOTO _UB_Update_Ball_Y ;
  994. MOVLW -1 ;
  995. MOVWF Ball_Dir_X ;
  996. ;
  997. INCF Score_1, F ;
  998. PLAY_SOUND 24, H'017F' ; Frequency, Duration
  999. BSF System_Status, P1_SERVICE_BIT ;
  1000. BCF System_Status, P2_SERVICE_BIT ;
  1001. MOVLW 0 ;
  1002. MOVWF Ball_Dir_X ;
  1003. MOVWF Ball_Dir_Y ;
  1004. MOVLW 15 ;
  1005. MOVWF Ball_X ;
  1006. MOVLW 27 ;
  1007. MOVWF Ball_Y ;
  1008. MOVFW Score_1 ;
  1009. ANDLW H'0F' ;
  1010. XORLW H'0A' ;
  1011. BTFSS STATUS, Z ;
  1012. GOTO _UB_BXMax_Exit ;
  1013. MOVFW Score_1 ;
  1014. ANDLW H'F0' ;
  1015. ADDLW H'10' ;
  1016. MOVWF Score_1 ;
  1017. MOVLW H'A0' ;
  1018. XORWF Score_1, W ;
  1019. BTFSC STATUS, Z ;
  1020. CLRF Score_1 ;
  1021. _UB_BXMax_Exit: ;
  1022. MOVLW H'11' ;
  1023. XORWF Score_1, W ;
  1024. BTFSS STATUS, Z ;
  1025. GOTO _UB_Exit ;
  1026. BSF System_Status, P1_SERVICE_BIT ;
  1027. BSF System_Status, P2_SERVICE_BIT ;
  1028. GOTO _UB_Exit ;
  1029. ;-----------------------------------------------;
  1030. ;
  1031. ;-----------------------------------------------;
  1032. ; Update Ball_Y position ;
  1033. ;-----------------------------------------------;
  1034. _UB_Update_Ball_Y: ;
  1035. MOVFW Ball_Dir_Y ;
  1036. ADDWF Ball_Y, F ;
  1037. ;-----------------------------------------------;
  1038. ;
  1039. ;-----------------------------------------------;
  1040. ; Check for collision with upper sideline ;
  1041. ;-----------------------------------------------;
  1042. _UB_Update_Ball_Y_Min: ;
  1043. BTFSS Ball_Y, MSB ;
  1044. GOTO _UB_Update_Ball_Y_Max ;
  1045. COMF Ball_Y, F ;
  1046. COMF Ball_Dir_Y, F ;
  1047. INCF Ball_Dir_Y, F ;
  1048. ;-----------------------------------------------;
  1049. ; Play the 'Ball Hit Sideline' sound ;
  1050. ;-----------------------------------------------;
  1051. PLAY_SOUND 6, H'017F' ; Frequency, Duration
  1052. GOTO _UB_Paddle_Detect_Left ;
  1053. ;-----------------------------------------------;
  1054. ;
  1055. ;-----------------------------------------------;
  1056. ; Check for collision with lower sideline ;
  1057. ;-----------------------------------------------;
  1058. _UB_Update_Ball_Y_Max: ;
  1059. MOVLW NUM_LINES - 2 ;
  1060. SUBWF Ball_Y, W ;
  1061. BTFSS STATUS, C ;
  1062. GOTO _UB_Paddle_Detect_Left ;
  1063. MOVLW NUM_LINES - 2 ;
  1064. MOVWF Ball_Y ;
  1065. COMF Ball_Dir_Y, F ;
  1066. INCF Ball_Dir_Y, F ;
  1067. ;-----------------------------------------------;
  1068. ; Play the 'Ball Hit Wall' sound ;
  1069. ;-----------------------------------------------;
  1070. PLAY_SOUND 6, H'017F' ; Frequency, Duration
  1071. ;-----------------------------------------------;
  1072. ;
  1073. ;-----------------------------------------------;
  1074. ; Check for collision with left paddle ;
  1075. ;-----------------------------------------------;
  1076. _UB_Paddle_Detect_Left: ;
  1077. ;-----------------------------------------------;
  1078. ; On the same vertical line as the left paddle? ;
  1079. ;-----------------------------------------------;
  1080. MOVLW 1 ;
  1081. XORWF Ball_X, W ;
  1082. BTFSS STATUS, Z ;
  1083. GOTO _UB_Paddle_Detect_Right ;
  1084. ;
  1085. MOVFW Paddle_1_Y ;
  1086. MOVWF Temp1 ;
  1087. GOTO _UB_PD_Check_Hit ;
  1088. ;
  1089. ;-----------------------------------------------;
  1090. ; Check for collision with right paddle ;
  1091. ;-----------------------------------------------;
  1092. _UB_Paddle_Detect_Right: ;
  1093. ;-----------------------------------------------;
  1094. ; On the same vertical line as the right paddle?;
  1095. ;-----------------------------------------------;
  1096. MOVLW 30 ;
  1097. XORWF Ball_X, W ;
  1098. BTFSS STATUS, Z ;
  1099. GOTO _UB_Exit ;
  1100. MOVFW Paddle_2_Y ;
  1101. MOVWF Temp1 ;
  1102. ;-----------------------------------------------;
  1103. ;
  1104. _UB_PD_Check_Hit: ;
  1105. ;-----------------------------------------------;
  1106. ; Are we on the save horizontal plane as the ;
  1107. ; paddle? ;
  1108. ;-----------------------------------------------;
  1109. MOVFW Ball_Y ;
  1110. ADDLW BALL_HEIGHT ;
  1111. SUBWF Temp1, W ;
  1112. BTFSC STATUS, C ;
  1113. GOTO _UB_Exit ;
  1114. ;
  1115. MOVFW Temp1 ;
  1116. ADDLW PADDLE_HEIGHT - 1 ;
  1117. MOVWF Temp2 ;
  1118. MOVFW Ball_Y ;
  1119. SUBWF Temp2, W ;
  1120. BTFSS STATUS, C ;
  1121. GOTO _UB_Exit ;
  1122. ;
  1123. _UB_PD_Its_A_Hit: ;
  1124. ;-----------------------------------------------;
  1125. ; Reverse the ball 'X' direction ;
  1126. ;-----------------------------------------------;
  1127. COMF Ball_Dir_X, F ;
  1128. INCF Ball_Dir_X, F ;
  1129. ;-----------------------------------------------;
  1130. ; Adjust the ball 'X' position ;
  1131. ;-----------------------------------------------;
  1132. MOVFW Ball_Dir_X ;
  1133. ADDWF Ball_X, F ;
  1134. ;-----------------------------------------------;
  1135. ; Play the 'Ball Hit Paddle' sound ;
  1136. ;-----------------------------------------------;
  1137. PLAY_SOUND 8, H'014F' ; Frequency, Duration
  1138. ;-----------------------------------------------;
  1139. ;
  1140. ;-----------------------------------------------;
  1141. ; Ball update done. Restore RBUTT as an output ;
  1142. ; for sound and wait for 60us to pass. ;
  1143. ;-----------------------------------------------;
  1144. _UB_Exit: ;
  1145. BANKSEL TRISA ;
  1146. BCF TRISA, RBUTT_BIT ; Set as OUTPUT (for AUDIO)
  1147. BANKSEL MEMORY ;
  1148. ;
  1149. RETURN ;
  1150. ;---------------------------------------------------;
  1151.  
  1152. ;---------------------------------------------------;
  1153. _Draw_Items: ;
  1154. ;---------------------------------------------------;
  1155. ;-----------------------------------------------;
  1156. ; 60us BLACK Line ;
  1157. ;-----------------------------------------------;
  1158. START_TIMING SIG_4US, SIG_60US ;
  1159. ;-----------------------------------------------;
  1160. ;
  1161. _DI_Draw_Service_Player_1: ;
  1162. MOVLW LOW VIDEO_BUFFER_START + SERVICE_1_START;
  1163. MOVWF FSR1L ;
  1164. MOVLW HIGH VIDEO_BUFFER_START ;
  1165. MOVWF FSR1H ;
  1166. MOVLW LOW SERVICE_TABLE ;
  1167. MOVWF FSR0L ;
  1168. MOVLW HIGH SERVICE_TABLE ;
  1169. MOVWF FSR0H ;
  1170. MOVLW (SERVICE_TABLE_END - SERVICE_TABLE_START) / 2
  1171. MOVWF Temp1 ;
  1172. _DI_DSP1_Next_Byte: ;
  1173. MOVFW INDF0 ;
  1174. BTFSS System_Status, P1_SERVICE_BIT ;
  1175. CLRW ;
  1176. BTFSC System_Status, P2_SERVICE_BIT ;
  1177. CLRW ;
  1178. MOVWF INDF1 ;
  1179. ADDFSR FSR0, 1 ;
  1180. ADDFSR FSR1, 4 ;
  1181. DECFSZ Temp1, F ;
  1182. GOTO _DI_DSP1_Next_Byte ;
  1183. ;
  1184. _DI_Draw_Service_Player_2: ;
  1185. MOVLW LOW VIDEO_BUFFER_START + SERVICE_2_START;
  1186. MOVWF FSR1L ;
  1187. MOVLW HIGH VIDEO_BUFFER_START ;
  1188. MOVWF FSR1H ;
  1189. MOVLW LOW SERVICE_TABLE ;
  1190. MOVWF FSR0L ;
  1191. MOVLW HIGH SERVICE_TABLE ;
  1192. MOVWF FSR0H ;
  1193. MOVLW (SERVICE_TABLE_END - SERVICE_TABLE_START) / 2
  1194. MOVWF Temp1 ;
  1195. ADDWF FSR0L, F ;
  1196. _DI_DSP2_Next_Byte: ;
  1197. MOVFW INDF0 ;
  1198. BTFSS System_Status, P2_SERVICE_BIT ;
  1199. CLRW ;
  1200. BTFSC System_Status, P1_SERVICE_BIT ;
  1201. CLRW ;
  1202. MOVWF INDF1 ;
  1203. ADDFSR FSR0, 1 ;
  1204. ADDFSR FSR1, 4 ;
  1205. DECFSZ Temp1, F ;
  1206. GOTO _DI_DSP2_Next_Byte ;
  1207. ;
  1208. _DI_Draw_Score1: ;
  1209. _DI_DS1_Draw_Left_Char: ;
  1210. SWAPF Score_1, W ;
  1211. ANDLW H'0F' ;
  1212. MOVWF Temp1 ;
  1213. ;
  1214. MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
  1215. MOVWF FSR1L ;
  1216. MOVLW HIGH VIDEO_BUFFER_START ;
  1217. MOVWF FSR1H ;
  1218. ;
  1219. MOVLW HIGH CHARACTER_TABLE ;
  1220. MOVWF FSR0H ;
  1221. MOVLW LOW CHARACTER_TABLE ;
  1222. ADDWF Temp1, W ;
  1223. BTFSC STATUS, C ;
  1224. INCF FSR0H, F ;
  1225. MOVWF FSR0L ;
  1226. ;
  1227. MOVLW 5 ;
  1228. MOVWF Temp1 ;
  1229. _DI_DS1_DLC_Next_Line: ;
  1230. MOVFW INDF0 ;
  1231. MOVWF DTemp ;
  1232. RRF DTemp, W ;
  1233. ANDLW H'70' ;
  1234. MOVWF INDF1 ;
  1235. ADDFSR FSR0, 10 ;
  1236. ADDFSR FSR1, 4 ;
  1237. DECFSZ Temp1, F ;
  1238. GOTO _DI_DS1_DLC_Next_Line ;
  1239. ;
  1240. _DI_DS1_Draw_Right_Char: ;
  1241. MOVFW Score_1 ;
  1242. ANDLW H'0F' ;
  1243. MOVWF Temp1 ;
  1244. ;
  1245. MOVLW LOW VIDEO_BUFFER_START + LEFT_SCORE_START;
  1246. MOVWF FSR1L ;
  1247. MOVLW HIGH VIDEO_BUFFER_START ;
  1248. MOVWF FSR1H ;
  1249. ;
  1250. MOVLW HIGH CHARACTER_TABLE ;
  1251. MOVWF FSR0H ;
  1252. MOVLW LOW CHARACTER_TABLE ;
  1253. ADDWF Temp1, W ;
  1254. BTFSC STATUS, C ;
  1255. INCF FSR0H, F ;
  1256. MOVWF FSR0L ;
  1257. ;
  1258. MOVLW 5 ;
  1259. MOVWF Temp1 ;
  1260. _DI_DS1_DRC_Next_Line: ;
  1261. MOVFW INDF0 ;
  1262. MOVWF DTemp ;
  1263. RRF DTemp, W ;
  1264. ANDLW H'07' ;
  1265. MOVWF DTemp ;
  1266. MOVFW INDF1 ;
  1267. IORWF DTemp, W ;
  1268. MOVWF INDF1 ;
  1269. ADDFSR FSR0, 10 ;
  1270. ADDFSR FSR1, 4 ;
  1271. DECFSZ Temp1, F ;
  1272. GOTO _DI_DS1_DRC_Next_Line ;
  1273. ;
  1274. _DI_Draw_Score2: ;
  1275. _DI_DS2_Draw_Left_Char: ;
  1276. SWAPF Score_2, W ;
  1277. ANDLW H'0F' ;
  1278. MOVWF Temp1 ;
  1279. ;
  1280. MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
  1281. MOVWF FSR1L ;
  1282. MOVLW HIGH VIDEO_BUFFER_START ;
  1283. MOVWF FSR1H ;
  1284. ;
  1285. MOVLW HIGH CHARACTER_TABLE ;
  1286. MOVWF FSR0H ;
  1287. MOVLW LOW CHARACTER_TABLE ;
  1288. ADDWF Temp1, W ;
  1289. BTFSC STATUS, C ;
  1290. INCF FSR0H, F ;
  1291. MOVWF FSR0L ;
  1292. ;
  1293. MOVLW 5 ;
  1294. MOVWF Temp1 ;
  1295. _DI_DS2_DLC_Next_Line: ;
  1296. MOVFW INDF0 ;
  1297. ANDLW H'E0' ;
  1298. MOVWF INDF1 ;
  1299. ADDFSR FSR0, 10 ;
  1300. ADDFSR FSR1, 4 ;
  1301. DECFSZ Temp1, F ;
  1302. GOTO _DI_DS2_DLC_Next_Line ;
  1303. ;
  1304. _DI_DS2_Draw_Right_Char: ;
  1305. MOVFW Score_2 ;
  1306. ANDLW H'0F' ;
  1307. MOVWF Temp1 ;
  1308. ;
  1309. MOVLW LOW VIDEO_BUFFER_START + RIGHT_SCORE_START;
  1310. MOVWF FSR1L ;
  1311. MOVLW HIGH VIDEO_BUFFER_START ;
  1312. MOVWF FSR1H ;
  1313. ;
  1314. MOVLW HIGH CHARACTER_TABLE ;
  1315. MOVWF FSR0H ;
  1316. MOVLW LOW CHARACTER_TABLE ;
  1317. ADDWF Temp1, W ;
  1318. BTFSC STATUS, C ;
  1319. INCF FSR0H, F ;
  1320. MOVWF FSR0L ;
  1321. MOVLW 5 ;
  1322. MOVWF Temp1 ;
  1323. _DI_DS2_DRC_Next_Line: ;
  1324. MOVFW INDF0 ;
  1325. ANDLW H'0E' ;
  1326. MOVWF DTemp ;
  1327. MOVFW INDF1 ;
  1328. IORWF DTemp, W ;
  1329. MOVWF INDF1 ;
  1330. ADDFSR FSR0, 10 ;
  1331. ADDFSR FSR1, 4 ;
  1332. DECFSZ Temp1, F ;
  1333. GOTO _DI_DS2_DRC_Next_Line ;
  1334. ;
  1335. ;-----------------------------------------------;
  1336. ; 60us BLACK Line ;
  1337. ;-----------------------------------------------;
  1338. START_TIMING SIG_4US, SIG_60US ;
  1339. ;-----------------------------------------------;
  1340. ;
  1341. _DI_Draw_Paddle_1: ;
  1342. MOVFW Paddle_1_Y ;
  1343. ADDWF Paddle_1_Y, W ;
  1344. ADDWF Paddle_1_Y, W ;
  1345. ADDWF Paddle_1_Y, W ;
  1346. ADDLW LOW VIDEO_BUFFER_START + LEFT_PADDLE_START;
  1347. MOVWF FSR1L ;
  1348. MOVLW HIGH VIDEO_BUFFER_START ;
  1349. MOVLW PADDLE_HEIGHT ;
  1350. MOVWF Temp1 ;
  1351. _DI_DP1_Next_Bit: ;
  1352. MOVFW INDF1 ;
  1353. IORLW LEFT_PADDLE_BIT ;
  1354. MOVWF INDF1 ;
  1355. ADDFSR FSR1, 4 ;
  1356. DECFSZ Temp1, F ;
  1357. GOTO _DI_DP1_Next_Bit ;
  1358. ;
  1359. _DI_Draw_Paddle_2: ;
  1360. MOVFW Paddle_2_Y ;
  1361. ADDWF Paddle_2_Y, W ;
  1362. ADDWF Paddle_2_Y, W ;
  1363. ADDWF Paddle_2_Y, W ;
  1364. ADDLW LOW VIDEO_BUFFER_START + RIGHT_PADDLE_START;
  1365. MOVWF FSR1L ;
  1366. MOVLW HIGH VIDEO_BUFFER_START ;
  1367. MOVWF FSR1H ;
  1368. MOVLW PADDLE_HEIGHT ;
  1369. MOVWF Temp1 ;
  1370. _DI_DP2_Next_Bit: ;
  1371. MOVFW INDF1 ;
  1372. IORLW RIGHT_PADDLE_BIT ;
  1373. MOVWF INDF1 ;
  1374. ADDFSR FSR1, 4 ;
  1375. DECFSZ Temp1, F ;
  1376. GOTO _DI_DP2_Next_Bit ;
  1377. ;
  1378. _DI_Draw_Ball: ;
  1379. ;-----------------------------------------------;
  1380. ; Check to see if the ball has any movement. If ;
  1381. ; not, we are either at the end of a game or ;
  1382. ; waiting for service. In that case, don't draw ;
  1383. ; the ball. ;
  1384. ;-----------------------------------------------;
  1385. CLRW ;
  1386. XORWF Ball_Dir_X, W ;
  1387. BTFSS STATUS, Z ;
  1388. GOTO _DI_DB_Draw ;
  1389. CLRW ;
  1390. XORWF Ball_Dir_Y, W ;
  1391. BTFSC STATUS, Z ;
  1392. GOTO _DI_Exit ;
  1393. MOVLW 1 ;
  1394. XORWF Ball_Wait, W ;
  1395. BTFSS STATUS, Z ;
  1396. GOTO _DI_Exit ;
  1397. ;
  1398. _DI_DB_Draw: ;
  1399. ;-----------------------------------------------;
  1400. ; This is where we actually 'draw' the ball. ;
  1401. ;-----------------------------------------------;
  1402. MOVFW Ball_Y ;
  1403. ADDWF Ball_Y, W ;
  1404. ADDWF Ball_Y, W ;
  1405. ADDWF Ball_Y, W ;
  1406. ADDLW LOW VIDEO_BUFFER_START ;
  1407. MOVWF FSR1L ;
  1408. RRF Ball_X, W ;
  1409. MOVWF Temp1 ;
  1410. RRF Temp1, F ;
  1411. RRF Temp1, W ;
  1412. ANDLW H'1F' ;
  1413. ADDWF FSR1L, F ;
  1414. MOVLW HIGH VIDEO_BUFFER_START ;
  1415. MOVWF FSR1H ;
  1416. ;
  1417. MOVFW Ball_X ;
  1418. ANDLW H'07' ;
  1419. MOVWF Temp1 ;
  1420. MOVLW H'80' ;
  1421. MOVWF DTemp ;
  1422. MOVLW 0 ; ;
  1423. XORWF Temp1, W ;
  1424. BTFSC STATUS, Z ;
  1425. GOTO $+5 ;
  1426. DECF Temp1, F ;
  1427. RRF DTemp, F ;
  1428. BCF DTemp, MSB ;
  1429. GOTO $-7 ;
  1430. ;
  1431. MOVLW BALL_HEIGHT ;
  1432. MOVWF Temp1 ;
  1433. MOVFW DTemp ;
  1434. _DI_DB_D_Next_Pixel: ;
  1435. XORWF INDF1, F ;
  1436. ADDFSR FSR1, 4 ;
  1437. DECFSZ Temp1, F ;
  1438. GOTO _DI_DB_D_Next_Pixel ;
  1439. ;
  1440. _DI_Exit: ;
  1441. RETURN ;
  1442. ;---------------------------------------------------;
  1443.  
  1444. ;---------------------------------------------------;
  1445. USER_CODE_2 CODE H'800' ;
  1446. ;---------------------------------------------------;
  1447. ;---------------------------------------------------;
  1448. _Initialize_System: ;
  1449. ;---;-----------------------------------------------;
  1450. ; Initialize Hardware ;
  1451. ;-----------------------------------------------;
  1452. ; - Oscillator ;
  1453. ;-----------------------------------------------;
  1454. BANKSEL OSCCON ;
  1455. MOVLW B'11110000' ; 32Mhz
  1456. MOVWF OSCCON ;
  1457. ;
  1458. BANKSEL OSCSTAT ; Wait for
  1459. IS1:MOVFW OSCSTAT ; high speed
  1460. ANDLW H'79' ; oscillator
  1461. XORLW H'59' ; to be
  1462. BTFSS STATUS, Z ; stable and
  1463. GOTO IS1 ; locked
  1464. ;-----------------------------------------------;
  1465. ;
  1466. ;-----------------------------------------------;
  1467. ; - GPIOs ;
  1468. ;-----------------------------------------------;
  1469. BANKSEL ANSELA ;
  1470. CLRF ANSELA ; ALL I/O as digital
  1471. #IF _USE_THUMBSTICKS_ ;
  1472. BSF ANSELA, LJOY_BIT ;
  1473. BSF ANSELA, RJOY_BIT ;
  1474. #ENDIF ;_USE_THUMBSTICKS_ ;
  1475. ;
  1476. BANKSEL LATA ;
  1477. CLRF LATA ;
  1478. ;
  1479. BANKSEL TRISA ;
  1480. CLRF TRISA ;
  1481. BCF TRISA, VIDEO_0_BIT ; Set as OUTPUT
  1482. BCF TRISA, VIDEO_1_BIT ; Set as OUTPUT
  1483. BCF TRISA, AUDIO_BIT ; Set as OUTPUT
  1484. #IF _USE_THUMBSTICKS_ ;
  1485. BSF TRISA, LJOY_BIT ; Set as INPUT
  1486. BSF TRISA, LBUTT_BIT ; Set as INPUT
  1487. BSF TRISA, RJOY_BIT ; Set as INPUT
  1488. BCF TRISA, RBUTT_BIT ; Set as OUTPUT (AUDIO)
  1489. #ELSE ;!_USE_THUMBSTICKS_ ;
  1490. BSF TRISA, LBUTT_1_BIT ; Set as INPUT
  1491. BSF TRISA, LBUTT_2_BIT ; Set as INPUT
  1492. BSF TRISA, RBUTT_1_BIT ; Set as INPUT
  1493. BSF TRISA, RBUTT_2_BIT ; Set as INPUT
  1494. #ENDIF ;_USE_THUMBSTICKS_ ;
  1495. ;
  1496. BANKSEL PORTA ;
  1497. CLRF PORTA ;
  1498. BCF PORTA, VIDEO_0_BIT ; Set LOW
  1499. BCF PORTA, VIDEO_1_BIT ; Set LOW
  1500. BSF PORTA, AUDIO_BIT ; Set HIGH
  1501. #IF _USE_THUMBSTICKS_ ;
  1502. BSF PORTA, LJOY_BIT ; Set HIGH
  1503. BSF PORTA, LBUTT_BIT ; Set HIGH
  1504. BSF PORTA, RJOY_BIT ; Set HIGH
  1505. BSF PORTA, RBUTT_BIT ; Set HIGH
  1506. #ELSE ;!_USE_THUMBSTICKS_ ;
  1507. BSF PORTA, LBUTT_1_BIT ; Set HIGH
  1508. BSF PORTA, LBUTT_2_BIT ; Set HIGH
  1509. BSF PORTA, RBUTT_1_BIT ; Set HIGH
  1510. BSF PORTA, RBUTT_2_BIT ; Set HIGH
  1511. #ENDIF ;_USE_THUMBSTICKS_ ;
  1512. ;-----------------------------------------------;
  1513. ;
  1514. ;-----------------------------------------------;
  1515. ; - Miscellaneous ;
  1516. ;-----------------------------------------------;
  1517. BANKSEL INTCON ;
  1518. CLRF INTCON ;
  1519. ;
  1520. BANKSEL OPTION_REG ;
  1521. CLRF OPTION_REG ;
  1522. ;-----------------------------------------------;
  1523. ;
  1524. ;-----------------------------------------------;
  1525. ; - Timer0 ;
  1526. ;-----------------------------------------------;
  1527. BANKSEL OPTION_REG ;
  1528. BCF OPTION_REG, NOT_WPUEN ;
  1529. BCF OPTION_REG, TMR0CS ;
  1530. BCF OPTION_REG, PSA ; prescaler to timer0
  1531. BCF OPTION_REG, PS2 ;
  1532. BCF OPTION_REG, PS1 ; 000 - 250ns
  1533. BCF OPTION_REG, PS0 ;
  1534. ;
  1535. BANKSEL TMR0 ;
  1536. MOVLW H'15' ;
  1537. MOVWF TMR0 ;
  1538. MOVWF Vid_Timing ;
  1539. MOVWF Next_Vid_Timing ;
  1540. ;
  1541. BANKSEL INTCON ;
  1542. BCF INTCON, TMR0IF ;
  1543. BSF INTCON, TMR0IE ;
  1544. BSF INTCON, GIE ;
  1545. ;-----------------------------------------------;
  1546. ;
  1547. ;-----------------------------------------------;
  1548. ; - Memory ;
  1549. ;-----------------------------------------------;
  1550. BANKSEL MEMORY ;
  1551. CLRF System_Status ;
  1552. BSF System_Status, P1_SERVICE_BIT ;
  1553. BSF System_Status, P2_SERVICE_BIT ;
  1554. BSF System_Status, VERTICAL_SYNC_BIT ;
  1555. BCF System_Status, BUZZ_BIT ;
  1556. MOVLW 0 ;
  1557. MOVWF Buzz_Count ;
  1558. MOVWF Buzz_Reload ;
  1559. MOVLW H'FF' ;
  1560. MOVWF Buzz_Dur_LO ;
  1561. MOVLW H'FF' ;
  1562. MOVWF Buzz_Dur_HI ;
  1563. MOVLW MAX_BALL_WAIT ;
  1564. MOVWF Ball_Wait ;
  1565. MOVLW 0 ;
  1566. MOVWF Score_1 ;
  1567. MOVLW 0 ;
  1568. MOVWF Score_2 ;
  1569. MOVLW 20 ;
  1570. MOVWF Paddle_1_Y ;
  1571. MOVLW 20 ;
  1572. MOVWF Paddle_2_Y ;
  1573. MOVLW 15 ;
  1574. MOVWF Ball_X ;
  1575. MOVLW 27 ;
  1576. MOVWF Ball_Y ;
  1577. MOVLW 0 ;
  1578. MOVWF Ball_Dir_X ;
  1579. MOVLW 0 ;
  1580. MOVWF Ball_Dir_Y ;
  1581. ;-----------------------------------------------;
  1582. ;
  1583. ;-----------------------------------------------;
  1584. ; - Video Buffer ;
  1585. ;-----------------------------------------------;
  1586. PAGESEL _Clear_Screen ;
  1587. CALL _Clear_Screen ;
  1588. PAGESEL $ ;
  1589. ;-----------------------------------------------;
  1590. ;
  1591. ;-----------------------------------------------;
  1592. ; - Other Subsystems ;
  1593. ;-----------------------------------------------;
  1594. ;-----------------------------------------------;
  1595. ;
  1596. ;-----------------------------------------------;
  1597. ; This will shake loose the PICKIT, if attached ;
  1598. ;-----------------------------------------------;
  1599. BANKSEL TRISA ;
  1600. BCF TRISA, RBUTT_BIT ;
  1601. BANKSEL PORTA ;
  1602. BSF PORTA, RBUTT_BIT ;
  1603. _IS_Wait_For_Button: ;
  1604. DELAY 255 ;
  1605. DELAY 255 ;
  1606. DELAY 255 ;
  1607. DELAY 255 ;
  1608. DELAY 255 ;
  1609. DELAY 255 ;
  1610. DELAY 255 ;
  1611. DELAY 255 ;
  1612. BANKSEL TRISA ;
  1613. BSF TRISA, RBUTT_BIT ;
  1614. BANKSEL PORTA ;
  1615. BTFSS PORTA, RBUTT_BIT ;
  1616. GOTO _IS_Wait_For_Button ;
  1617. BANKSEL TRISA ;
  1618. BCF TRISA, RBUTT_BIT ;
  1619. BANKSEL PORTA ;
  1620. BSF PORTA, RBUTT_BIT ;
  1621. ;-----------------------------------------------;
  1622. ;
  1623. ; PAGESEL _Next_Frame ;
  1624. ; GOTO _Next_Frame ;
  1625. ;---------------------------------------------------;
  1626.  
  1627. ;---------------------------------------------------;
  1628. _Next_Frame: ;
  1629. ;---------------------------------------------------;
  1630. ; VERTICAL SYNC PULSE Time ;
  1631. ; This consists of 5 blank half lines, ;
  1632. ; 4 inverted half lines, and 5 more blank half ;
  1633. ; lines. This totals 7 full lines of 64us each. ;
  1634. ; --------------------------------------------- ;
  1635. ; NOTE: Timing is CRITICAL for a nice, clean ;
  1636. ; display. If you notice the top part of the ;
  1637. ; display is skewed or "tearing", your timings ;
  1638. ; are wrong and need to be adjusted. Make sure ;
  1639. ; you haven't inadvertently dropped a half frame;
  1640. ;-----------------------------------------------;
  1641. ; First, a special blank 30us line. If _DEBUG_ ;
  1642. ; is enabled, it will produce a pulse on the ;
  1643. ; GPIO2 pin for debugging purposes (checking the;
  1644. ; time elapsed for a single video frame). ;
  1645. ;-----------------------------------------------;
  1646. BSF System_Status, VERTICAL_SYNC_BIT ;
  1647. PAGESEL _Vertical_Sync ;
  1648. CALL _Vertical_Sync ;
  1649. PAGESEL $ ;
  1650. ;-----------------------------------------------;
  1651. ; Just a bunch of BLANK LINES, so that the video;
  1652. ; data doesn't start in the non-display area. ;
  1653. ; Add or remove lines to adjust the vertical ;
  1654. ; position of your video. If you add or remove, ;
  1655. ; make sure to adjust the number of BLANK LINES ;
  1656. ; which follow the data lines, so that the video;
  1657. ; stays at 60hz ;
  1658. ;-----------------------------------------------;
  1659. PAGESEL _Black_Line_60us ;
  1660. CALL _Black_Line_60us ;
  1661. PAGESEL $ ;
  1662. BCF System_Status, VERTICAL_SYNC_BIT ;
  1663. MOVLW 12 + ((MAX_LINES - NUM_LINES) * 2) ;
  1664. MOVWF Line_Count ;
  1665. _NF_Next_Black_60us_Line1: ;
  1666. PAGESEL _Black_Line_60us ;
  1667. CALL _Black_Line_60us ;
  1668. PAGESEL $ ;
  1669. DECFSZ Line_Count, F ;
  1670. GOTO _NF_Next_Black_60us_Line1 ;
  1671. ;-----------------------------------------------;
  1672. ;
  1673. ;-----------------------------------------------;
  1674. ; 2 WHITE lines + 192 DATA lines (assuming ;
  1675. ; NUM_LINES = 48) + 2 WHITE lines + 1 BLACK line;
  1676. ;-----------------------------------------------;
  1677. PAGESEL _Data_Lines ;
  1678. CALL _Data_Lines ;
  1679. PAGESEL $ ;
  1680. ;-----------------------------------------------;
  1681. ;
  1682. ;-----------------------------------------------;
  1683. ; Display copyright and software version number.;
  1684. ; 8 60us lines ;
  1685. ;-----------------------------------------------;
  1686. PAGESEL _Copyright ;
  1687. CALL _Copyright ;
  1688. PAGESEL $ ;
  1689. ;-----------------------------------------------;
  1690. ;
  1691. ;-----------------------------------------------;
  1692. ; One BLACK line and two WHITE lines: ;
  1693. ;-----------------------------------------------;
  1694. PAGESEL _Black_Line_60us ;
  1695. CALL _Black_Line_60us ;
  1696. PAGESEL _White_Line_60us ;
  1697. CALL _White_Line_60us ;
  1698. CALL _White_Line_60us ;
  1699. PAGESEL $ ;
  1700. ;-----------------------------------------------;
  1701. ;
  1702. ;-----------------------------------------------;
  1703. ; More BLACK Lines: ;
  1704. ;-----------------------------------------------;
  1705. #IF ((MAX_LINES - NUM_LINES) * 2) > 8 ;
  1706. MOVLW ((MAX_LINES - NUM_LINES) * 2) - 8 ;
  1707. MOVWF Line_Count ;
  1708. _NF_Next_Black_60us_Line2: ;
  1709. PAGESEL _Black_Line_60us ;
  1710. CALL _Black_Line_60us ;
  1711. PAGESEL $ ;
  1712. DECFSZ Line_Count, F ;
  1713. GOTO _NF_Next_Black_60us_Line2 ;
  1714. #ENDIF ;
  1715. ;-----------------------------------------------;
  1716.  
  1717. ;-----------------------------------------------;
  1718. ; Clear the scores, paddles and ball from the ;
  1719. ; display - and draw the Title if necessary. ;
  1720. ; 2 60us lines ;
  1721. ;-----------------------------------------------;
  1722. PAGESEL _Clear_Screen ;
  1723. CALL _Clear_Screen ; 2 BLACK 60us lines
  1724. PAGESEL $ ; Screen Clear / Title Draw
  1725. ;-----------------------------------------------;
  1726. ;
  1727. ;-----------------------------------------------;
  1728. ; All of the game processing is done here, the ;
  1729. ; last 4 full 60us BLACK lines ;
  1730. ;-----------------------------------------------;
  1731. PAGESEL _Update_Paddles ;
  1732. CALL _Update_Paddles ; 1 BLACK 60us line
  1733. PAGESEL $ ; Paddles Computations
  1734. PAGESEL _Update_Ball ;
  1735. CALL _Update_Ball ; 1 BLACK 60us line
  1736. PAGESEL $ ; Ball Computations
  1737. PAGESEL _Draw_Items ;
  1738. CALL _Draw_Items ; 2 BLACK 60us lines
  1739. PAGESEL $ ; Scores/Paddles/Ball Display
  1740. ;-----------------------------------------------;
  1741. ;
  1742. ;-----------------------------------------------;
  1743. ; So, to summarize (with NUM_LINES = 48): ;
  1744. ; - 7 VERTICAL SYNC lines (14 30us lines) ;
  1745. ; - 30 BLANK LINES for screen centering ;
  1746. ; - 2 WHITE lines for COURT SIDELINE ;
  1747. ; - 192 DATA lines for GAME FIELD ;
  1748. ; - 2 WHITE lines for COURT SIDELINE ;
  1749. ; - 1 BLANK line between SIDELINE & COPYRIGHT ;
  1750. ; - 8 DATA lines for COPYRIGHT ;
  1751. ; - 12 BLANK lines for screen centering ;
  1752. ; - 2 BLANK lines for screen clear / title ;
  1753. ; - 4 BLANK lines for game processing ;
  1754. ; ;
  1755. ; For a total of 260 lines at 64us each, or ;
  1756. ; 16.637ms, or approximately 60hz. 16.666ms ;
  1757. ; would be _perfect_. ;
  1758. ;-----------------------------------------------;
  1759. ;
  1760. GOTO _Next_Frame ;
  1761. ;---------------------------------------------------;
  1762.  
  1763. ;---------------------------------------------------;
  1764. _Vertical_Sync: ;
  1765. ;---------------------------------------------------;
  1766. ; The _Special_30us_Line will produce a pulse on;
  1767. ; GPIO2 if the _DEBUG_ flag is set to TRUE. This;
  1768. ; is for checking the timing of the entire video;
  1769. ; frame (~60hz, ~16.66ms). ;
  1770. ;-----------------------------------------------;
  1771. START_TIMING SIG_2US, SIG_30US ;
  1772. START_TIMING SIG_2US, SIG_30US ;
  1773. START_TIMING SIG_2US, SIG_30US ;
  1774. START_TIMING SIG_2US, SIG_30US ;
  1775. START_TIMING SIG_2US, SIG_30US ;
  1776. ;-----------------------------------------------;
  1777. ; If _DEBUG_ is enabled, it will produce a pulse;
  1778. ; on the GPIO2 pin for debugging purposes. This ;
  1779. ; pulse is mainly to measure the time (in ms) ;
  1780. ; and frequency of a single video frame. ;
  1781. ;-----------------------------------------------;
  1782. #IF _DEBUG_ ;
  1783. BANKSEL TRISA ;
  1784. BCF TRISA, 2 ;
  1785. BANKSEL PORTA ;
  1786. BCF PORTA, 2 ;
  1787. NOP ;
  1788. BSF PORTA, 2 ;
  1789. BANKSEL TRISA ;
  1790. BSF TRISA, 2 ;
  1791. BANKSEL MEMORY ;
  1792. #ENDIF ; _DEBUG_ ;
  1793. ;-----------------------------------------------;
  1794. ; 4 inverted 30us lines ;
  1795. ;-----------------------------------------------;
  1796. START_TIMING SIG_30US, SIG_2US ;
  1797. START_TIMING SIG_30US, SIG_2US ;
  1798. START_TIMING SIG_30US, SIG_2US ;
  1799. START_TIMING SIG_30US, SIG_2US ;
  1800. ;-----------------------------------------------;
  1801. ; 5 more blank 30us lines ;
  1802. ;-----------------------------------------------;
  1803. START_TIMING SIG_2US, SIG_30US ;
  1804. START_TIMING SIG_2US, SIG_30US ;
  1805. START_TIMING SIG_2US, SIG_30US ;
  1806. START_TIMING SIG_2US, SIG_30US ;
  1807. START_TIMING SIG_2US, SIG_30US ;
  1808. RETURN ;
  1809. ;---------------------------------------------------;
  1810.  
  1811. ;---------------------------------------------------;
  1812. _Data_Lines: ;
  1813. ;---------------------------------------------------;
  1814. ; Note: This will generate 1 60us blank line, then ;
  1815. ; 224 60us data lines, and finally a 60us blank line;
  1816. ;---------------------------------------------------;
  1817. ;-----------------------------------------------;
  1818. ; Two WHITE lines and one BLACK line ;
  1819. ;-----------------------------------------------;
  1820. PAGESEL _White_Line_60us ;
  1821. CALL _White_Line_60us ;
  1822. CALL _White_Line_60us ;
  1823. PAGESEL _Black_Line_60us ;
  1824. CALL _Black_Line_60us ;
  1825. PAGESEL $ ;
  1826. DELAY 77 ;
  1827. NOP ;
  1828. BCF PORTA, VIDEO_0_BIT ;
  1829. BCF PORTA, VIDEO_0_BIT ;
  1830. BSF PORTA, VIDEO_0_BIT ;
  1831. BSF PORTA, VIDEO_0_BIT ;
  1832. BCF PORTA, VIDEO_0_BIT ;
  1833. ;-----------------------------------------------;
  1834. ;
  1835. ;-----------------------------------------------;
  1836. ; Set up of video buffer pointer and line count ;
  1837. ;-----------------------------------------------;
  1838. MOVLW LOW VIDEO_BUFFER_START ;
  1839. MOVWF FSR1L ;
  1840. MOVLW HIGH VIDEO_BUFFER_START ;
  1841. MOVWF FSR1H ;
  1842. ;
  1843. MOVLW NUM_LINES ;
  1844. MOVWF DL_Count ;
  1845. ;-----------------------------------------------;
  1846. ;
  1847. ;-----------------------------------------------;
  1848. ; We repeat each line 4 times, since we don't ;
  1849. ; have a big enough video buffer for 192 lines ;
  1850. ;-----------------------------------------------;
  1851. _DL_Next_Line: ;
  1852. MOVLW 4 ;
  1853. MOVWF Repeat_Count ;
  1854. _DL_Repeat_Line: ;
  1855. MOVLW H'FC' ;
  1856. ANDWF FSR1L, F ;
  1857. ;-----------------------------------------------;
  1858. ;
  1859. ;-----------------------------------------------;
  1860. ; 60us Line Generation ;
  1861. ;-----------------------------------------------;
  1862. PAGESEL _Black_Line_60us ;
  1863. CALL _Black_Line_60us ;
  1864. PAGESEL $ ;
  1865. ;-----------------------------------------------;
  1866. ;
  1867. ;-----------------------------------------------;
  1868. ; Front porch - shifts the data to the right ;
  1869. ; and hopefully centers it on the screen ;
  1870. ;-----------------------------------------------;
  1871. DELAY 13 ;
  1872. NOP ;
  1873. ;-----------------------------------------------;
  1874. ;
  1875. ;-----------------------------------------------;
  1876. ; This is where the 32 bits of data are actually;
  1877. ; send out over the video signal ;
  1878. ;-----------------------------------------------;
  1879. DO_BIT 7, 8 ;
  1880. DO_BIT 6, 8 ;
  1881. DO_BIT 5, 8 ;
  1882. DO_BIT 4, 8 ;
  1883. DO_BIT 3, 8 ;
  1884. DO_BIT 2, 8 ;
  1885. DO_BIT 1, 8 ;
  1886. DO_BIT 0, 7 ;
  1887. ;
  1888. ADDFSR FSR1, 1 ;
  1889. ;
  1890. DO_BIT 7, 8 ;
  1891. DO_BIT 6, 8 ;
  1892. DO_BIT 5, 8 ;
  1893. DO_BIT 4, 8 ;
  1894. DO_BIT 3, 8 ;
  1895. DO_BIT 2, 8 ;
  1896. DO_BIT 1, 8 ;
  1897. DO_BIT 0, 7 ;
  1898. ;
  1899. ADDFSR FSR1, 1 ;
  1900. ;
  1901. _DL_Center_Line: ;
  1902. BCF PORTA, VIDEO_0_BIT ;
  1903. BCF PORTA, VIDEO_0_BIT ;
  1904. BSF PORTA, VIDEO_0_BIT ;
  1905. BSF PORTA, VIDEO_0_BIT ;
  1906. BCF PORTA, VIDEO_0_BIT ;
  1907. _DL_Center_Line_Done: ;
  1908. ;
  1909. DO_BIT 7, 8 ;
  1910. DO_BIT 6, 8 ;
  1911. DO_BIT 5, 8 ;
  1912. DO_BIT 4, 8 ;
  1913. DO_BIT 3, 8 ;
  1914. DO_BIT 2, 8 ;
  1915. DO_BIT 1, 8 ;
  1916. DO_BIT 0, 7 ;
  1917. ;
  1918. ADDFSR FSR1, 1 ;
  1919. ;
  1920. DO_BIT 7, 8 ;
  1921. DO_BIT 6, 8 ;
  1922. DO_BIT 5, 8 ;
  1923. DO_BIT 4, 8 ;
  1924. DO_BIT 3, 8 ;
  1925. DO_BIT 2, 8 ;
  1926. DO_BIT 1, 8 ;
  1927. DO_BIT 0, 7 ;
  1928. ;
  1929. ADDFSR FSR1, 1 ;
  1930. ;
  1931. DECF FSR1L, F ;
  1932. ;-----------------------------------------------;
  1933. ;
  1934. ;-----------------------------------------------;
  1935. ; Back porch - between this and the front porch,;
  1936. ; this 'frames' the video on your TV (hopefully);
  1937. ; --------------------------------------------- ;
  1938. ; NOTE: this DELAY and NOPs fleshes out the data;
  1939. ; line to 60us ;
  1940. ;-----------------------------------------------;
  1941. SET_DAC2BIT COLOR_BLACK ;
  1942. ;-----------------------------------------------;
  1943. ;
  1944. DECFSZ Repeat_Count, F ;
  1945. GOTO _DL_Repeat_Line ;
  1946. GOTO _DL_Next_Data ;
  1947. ;
  1948. ;-----------------------------------------------;
  1949. ; 224 lines of information to transmit ;
  1950. ; so the screen size is 32x224. But we transmit ;
  1951. ; each line 4 times, so it's actually 32x56 ;
  1952. ;-----------------------------------------------;
  1953. _DL_Next_Data: ;
  1954. ;-----------------------------------------------;
  1955. ADDFSR FSR1, 1 ;
  1956. DECFSZ DL_Count, F ;
  1957. GOTO _DL_Next_Line ;
  1958. ;
  1959. ;-----------------------------------------------;
  1960. ; Two WHITE line and 1 BLACK line ;
  1961. ;-----------------------------------------------;
  1962. PAGESEL _Black_Line_60us ;
  1963. CALL _Black_Line_60us ;
  1964. PAGESEL $ ;
  1965. DELAY 77 ;
  1966. NOP ;
  1967. BCF PORTA, VIDEO_0_BIT ;
  1968. BCF PORTA, VIDEO_0_BIT ;
  1969. BSF PORTA, VIDEO_0_BIT ;
  1970. BSF PORTA, VIDEO_0_BIT ;
  1971. BCF PORTA, VIDEO_0_BIT ;
  1972. PAGESEL _White_Line_60us ;
  1973. CALL _White_Line_60us ;
  1974. CALL _White_Line_60us ;
  1975. PAGESEL _Black_Line_60us ;
  1976. CALL _Black_Line_60us ;
  1977. PAGESEL $ ;
  1978. ;-----------------------------------------------;
  1979. ;
  1980. RETURN ;
  1981. ;---------------------------------------------------;
  1982.  
  1983. ;---------------------------------------------------;
  1984. _Copyright: ;
  1985. ;---------------------------------------------------;
  1986. ; Note: This is a 60us line routine. It will ;
  1987. ; generate 8 60us data lines. ;
  1988. ;---------------------------------------------------;
  1989. ;-----------------------------------------------;
  1990. ; Setup ;
  1991. ;-----------------------------------------------;
  1992. MOVLW LOW COPYRIGHT_TABLE ;
  1993. MOVWF FSR1L ;
  1994. MOVLW HIGH COPYRIGHT_TABLE ;
  1995. MOVWF FSR1H ;
  1996. MOVLW 8 ;
  1997. MOVWF Temp1 ;
  1998. ;-----------------------------------------------;
  1999. ;
  2000. ;-----------------------------------------------;
  2001. ; 8 60us Data Lines Generation ;
  2002. ;-----------------------------------------------;
  2003. _CR_Next_Line: ;
  2004. ;-----------------------------------------------;
  2005. ; 60us BLACK Line ;
  2006. ;-----------------------------------------------;
  2007. START_TIMING SIG_4US, SIG_60US ;
  2008. ;-----------------------------------------------;
  2009. ;
  2010. ;-----------------------------------------------;
  2011. ; Xus Back Porch (Black Signal) Generation ;
  2012. ;-----------------------------------------------;
  2013. DELAY 13 ;
  2014. NOP ;
  2015. ;-----------------------------------------------;
  2016. ;
  2017. ;-----------------------------------------------;
  2018. ; Data Generation ;
  2019. ;-----------------------------------------------;
  2020. DO_BIT 7, 0 ;
  2021. DO_BIT 6, 0 ;
  2022. DO_BIT 5, 0 ;
  2023. DO_BIT 4, 0 ;
  2024. DO_BIT 3, 0 ;
  2025. DO_BIT 2, 0 ;
  2026. DO_BIT 1, 0 ;
  2027. DO_BIT 0, 0 ;
  2028. ADDFSR FSR1, 1 ;
  2029. DO_BIT 7, 0 ;
  2030. DO_BIT 6, 0 ;
  2031. DO_BIT 5, 0 ;
  2032. DO_BIT 4, 0 ;
  2033. DO_BIT 3, 0 ;
  2034. DO_BIT 2, 0 ;
  2035. DO_BIT 1, 0 ;
  2036. DO_BIT 0, 0 ;
  2037. ADDFSR FSR1, 1 ;
  2038. DO_BIT 7, 0 ;
  2039. DO_BIT 6, 0 ;
  2040. DO_BIT 5, 0 ;
  2041. DO_BIT 4, 0 ;
  2042. DO_BIT 3, 0 ;
  2043. DO_BIT 2, 0 ;
  2044. DO_BIT 1, 0 ;
  2045. DO_BIT 0, 0 ;
  2046. ADDFSR FSR1, 1 ;
  2047. DO_BIT 7, 0 ;
  2048. DO_BIT 6, 0 ;
  2049. DO_BIT 5, 0 ;
  2050. DO_BIT 4, 0 ;
  2051. DO_BIT 3, 0 ;
  2052. DO_BIT 2, 0 ;
  2053. DO_BIT 1, 0 ;
  2054. DO_BIT 0, 0 ;
  2055. ADDFSR FSR1, 1 ;
  2056. DO_BIT 7, 0 ;
  2057. DO_BIT 6, 0 ;
  2058. DO_BIT 5, 0 ;
  2059. DO_BIT 4, 0 ;
  2060. DO_BIT 3, 0 ;
  2061. DO_BIT 2, 0 ;
  2062. DO_BIT 1, 0 ;
  2063. DO_BIT 0, 0 ;
  2064. ADDFSR FSR1, 1 ;
  2065. DO_BIT 7, 0 ;
  2066. DO_BIT 6, 0 ;
  2067. DO_BIT 5, 0 ;
  2068. DO_BIT 4, 0 ;
  2069. DO_BIT 3, 0 ;
  2070. DO_BIT 2, 0 ;
  2071. DO_BIT 1, 0 ;
  2072. DO_BIT 0, 0 ;
  2073. ADDFSR FSR1, 1 ;
  2074. DO_BIT 7, 0 ;
  2075. DO_BIT 6, 0 ;
  2076. DO_BIT 5, 0 ;
  2077. DO_BIT 4, 0 ;
  2078. DO_BIT 3, 0 ;
  2079. DO_BIT 2, 0 ;
  2080. DO_BIT 1, 0 ;
  2081. DO_BIT 0, 0 ;
  2082. ADDFSR FSR1, 1 ;
  2083. DO_BIT 7, 0 ;
  2084. DO_BIT 6, 0 ;
  2085. DO_BIT 5, 0 ;
  2086. DO_BIT 4, 0 ;
  2087. DO_BIT 3, 0 ;
  2088. DO_BIT 2, 0 ;
  2089. DO_BIT 1, 0 ;
  2090. DO_BIT 0, 0 ;
  2091. ADDFSR FSR1, 1 ;
  2092. ;-----------------------------------------------;
  2093. ;
  2094. ;-----------------------------------------------;
  2095. ; Xus Front Porch (Black Signal) Generation ;
  2096. ;-----------------------------------------------;
  2097. NOP ;
  2098. SET_DAC2BIT COLOR_BLACK ;
  2099. ;-----------------------------------------------;
  2100. ;
  2101. ;-----------------------------------------------;
  2102. ; All of this nonsense is just to get the timing;
  2103. ; right between doing the next copyright line or;
  2104. ; starting the series of blank lines. ;
  2105. ;-----------------------------------------------;
  2106. DECFSZ Temp1, F ;
  2107. GOTO _CR_Next_Line ;
  2108. RETURN ;
  2109. ;---------------------------------------------------;
  2110.  
  2111. ;---------------------------------------------------;
  2112. _Black_Line_30us: ;
  2113. ;---------------------------------------------------;
  2114. START_TIMING SIG_2US, SIG_30US ;
  2115. RETURN ;
  2116. ;---------------------------------------------------;
  2117.  
  2118. ;---------------------------------------------------;
  2119. _Black_Line_60us: ;
  2120. ;---------------------------------------------------;
  2121. START_TIMING SIG_4US, SIG_60US ;
  2122. RETURN ;
  2123. ;---------------------------------------------------;
  2124.  
  2125. ;---------------------------------------------------;
  2126. _White_Line_60us: ;
  2127. ;---------------------------------------------------;
  2128. PAGESEL _Black_Line_60us ;
  2129. CALL _Black_Line_60us ;
  2130. PAGESEL $ ;
  2131. BSF PORTA, VIDEO_0_BIT ;
  2132. DELAY 149 ;
  2133. BCF PORTA, VIDEO_0_BIT ;
  2134. RETURN ;
  2135. ;---------------------------------------------------;
  2136.  
  2137. ;---------------------------------------------------;
  2138. _Clear_Screen: ;
  2139. ;---------------------------------------------------;
  2140. ; This is a 2 60us BLACK lines routine ;
  2141. ;---------------------------------------------------;
  2142. ;-----------------------------------------------;
  2143. ; 60us BLACK Line ;
  2144. ;-----------------------------------------------;
  2145. START_TIMING SIG_4US, SIG_60US ;
  2146. ;-----------------------------------------------;
  2147. ;
  2148. _CS_Top: ;
  2149. ;-----------------------------------------------;
  2150. ; Set up the pointer to the video buffer ;
  2151. ;-----------------------------------------------;
  2152. MOVLW HIGH VIDEO_BUFFER_START ;
  2153. MOVWF FSR1H ;
  2154. MOVLW LOW VIDEO_BUFFER_START ;
  2155. MOVWF FSR1L ;
  2156. ;-----------------------------------------------;
  2157. ;
  2158. ;-----------------------------------------------;
  2159. ; Set up the pointer to the title table ;
  2160. ;-----------------------------------------------;
  2161. MOVLW HIGH TITLE_TABLE ;
  2162. MOVWF FSR0H ;
  2163. MOVLW LOW TITLE_TABLE ;
  2164. MOVWF FSR0L ;
  2165. ;-----------------------------------------------;
  2166. ;
  2167. ;-----------------------------------------------;
  2168. ; Set up the number of bytes to transfer ;
  2169. ;-----------------------------------------------;
  2170. MOVLW ((NUM_LINES * 4) /2) / 8 ;
  2171. MOVWF Temp1 ;
  2172. ;-----------------------------------------------;
  2173. ;
  2174. ;-----------------------------------------------;
  2175. ; Transfer the data from the title table to the ;
  2176. ; video buffer, 8 bytes at a time. Doing it in ;
  2177. ; groups of 8 in a loop, instead of 1 byte at a ;
  2178. ; time in a loop, speeds up the transfer as it ;
  2179. ; cuts out a lot of the instruction cycles for ;
  2180. ; the looping mechanism. ;
  2181. ;-----------------------------------------------;
  2182. _CS_T_Next_8_Bytes: ;
  2183. MOVIW 0[INDF0] ;
  2184. MOVWI 0[INDF1] ;
  2185. MOVIW 1[INDF0] ;
  2186. MOVWI 1[INDF1] ;
  2187. MOVIW 2[INDF0] ;
  2188. MOVWI 2[INDF1] ;
  2189. MOVIW 3[INDF0] ;
  2190. MOVWI 3[INDF1] ;
  2191. MOVIW 4[INDF0] ;
  2192. MOVWI 4[INDF1] ;
  2193. MOVIW 5[INDF0] ;
  2194. MOVWI 5[INDF1] ;
  2195. MOVIW 6[INDF0] ;
  2196. MOVWI 6[INDF1] ;
  2197. MOVIW 7[INDF0] ;
  2198. MOVWI 7[INDF1] ;
  2199. _CS_T_Check_For_Title: ;
  2200. BTFSC System_Status, P1_SERVICE_BIT ; If SERVICE is clear for both
  2201. BTFSS System_Status, P2_SERVICE_BIT ; players, then it's the start
  2202. GOTO $+2 ; of a game. Draw the title.
  2203. ADDFSR FSR0, 8 ;
  2204. ADDFSR FSR1, 8 ;
  2205. DECFSZ Temp1, F ;
  2206. GOTO _CS_T_Next_8_Bytes ;
  2207. ;-----------------------------------------------;
  2208. ;
  2209. ;-----------------------------------------------;
  2210. ; 60us BLACK Line ;
  2211. ;-----------------------------------------------;
  2212. START_TIMING SIG_4US, SIG_60US ;
  2213. ;-----------------------------------------------;
  2214. ;
  2215. _CS_Bottom: ;
  2216. ;-----------------------------------------------;
  2217. ; Set up the pointer to the video buffer ;
  2218. ;-----------------------------------------------;
  2219. MOVLW HIGH VIDEO_BUFFER_START ;
  2220. MOVWF FSR1H ;
  2221. MOVLW LOW VIDEO_BUFFER_START ;
  2222. ADDLW (NUM_LINES * 4) / 2 ;
  2223. MOVWF FSR1L ;
  2224. BTFSC STATUS, C ;
  2225. INCF FSR1H, F ;
  2226. ;-----------------------------------------------;
  2227. ;
  2228. ;-----------------------------------------------;
  2229. ; Set up the pointer to the title table ;
  2230. ;-----------------------------------------------;
  2231. MOVLW HIGH TITLE_TABLE ;
  2232. MOVWF FSR0H ;
  2233. MOVLW LOW TITLE_TABLE ;
  2234. _CS_B_Check_For_Title1: ;
  2235. BTFSC System_Status, P1_SERVICE_BIT ; If SERVICE is clear for both
  2236. BTFSS System_Status, P2_SERVICE_BIT ; players, then it's the start
  2237. GOTO $+2 ; of a game. Draw the title.
  2238. ADDLW (NUM_LINES * 4) / 2 ;
  2239. MOVWF FSR0L ;
  2240. BTFSC STATUS, C ;
  2241. INCF FSR0H, F ;
  2242. ;-----------------------------------------------;
  2243. ;
  2244. ;-----------------------------------------------;
  2245. ; Set up the number of bytes to transfer ;
  2246. ;-----------------------------------------------;
  2247. MOVLW ((NUM_LINES * 4) /2) / 8 ;
  2248. MOVWF Temp1 ;
  2249. ;-----------------------------------------------;
  2250. ;
  2251. ;-----------------------------------------------;
  2252. ; Transfer the data from the title table to the ;
  2253. ; video buffer, 8 bytes at a time. Doing it in ;
  2254. ; groups of 8 in a loop, instead of 1 byte at a ;
  2255. ; time in a loop, speeds up the transfer as it ;
  2256. ; cuts out a lot of the instruction cycles for ;
  2257. ; the looping mechanism. ;
  2258. ;-----------------------------------------------;
  2259. _CS_B_Next_8_Bytes: ;
  2260. MOVIW 0[INDF0] ;
  2261. MOVWI 0[INDF1] ;
  2262. MOVIW 1[INDF0] ;
  2263. MOVWI 1[INDF1] ;
  2264. MOVIW 2[INDF0] ;
  2265. MOVWI 2[INDF1] ;
  2266. MOVIW 3[INDF0] ;
  2267. MOVWI 3[INDF1] ;
  2268. MOVIW 4[INDF0] ;
  2269. MOVWI 4[INDF1] ;
  2270. MOVIW 5[INDF0] ;
  2271. MOVWI 5[INDF1] ;
  2272. MOVIW 6[INDF0] ;
  2273. MOVWI 6[INDF1] ;
  2274. MOVIW 7[INDF0] ;
  2275. MOVWI 7[INDF1] ;
  2276. _CS_B_Check_For_Title2: ;
  2277. BTFSC System_Status, P1_SERVICE_BIT ; If SERVICE is clear for both
  2278. BTFSS System_Status, P2_SERVICE_BIT ; players, then it's the start
  2279. GOTO $+2 ; of a game. Draw the title.
  2280. ADDFSR FSR0, 8 ;
  2281. ADDFSR FSR1, 8 ;
  2282. DECFSZ Temp1, F ;
  2283. GOTO _CS_B_Next_8_Bytes ;
  2284. ;-----------------------------------------------;
  2285. ;
  2286. RETURN ;
  2287. ;---------------------------------------------------;
  2288.  
  2289. ;---------------------------------------------------;
  2290. ; Numeric Characters (0-9) Scan Line Data ;
  2291. ;---------------------------------------------------;
  2292. CHARACTER_TABLE: ;
  2293. ;---------------------------------------------------;
  2294. ; These are the bitmaps for the score characters;
  2295. ; 0-9, 4x5 pixels ;
  2296. ;-----------------------------------------------;
  2297. DT B'11101110', B'01000100', B'11101110', B'11101110', B'10101010', B'11101110', B'11101110', B'11101110', B'11101110', B'11101110'
  2298. DT B'10101010', B'11001100', B'00100010', B'00100010', B'10101010', B'10001000', B'10001000', B'00100010', B'10101010', B'10101010'
  2299. DT B'10101010', B'01000100', B'11101110', B'11101110', B'11101110', B'11101110', B'11101110', B'00100010', B'11101110', B'11101110'
  2300. DT B'10101010', B'01000100', B'10001000', B'00100010', B'00100010', B'00100010', B'10101010', B'00100010', B'10101010', B'00100010'
  2301. DT B'11101110', B'01000100', B'11101110', B'11101110', B'00100010', B'11101110', B'11101110', B'00100010', B'11101110', B'00100010'
  2302. ;---------------------------------------------------;
  2303.  
  2304. ;---------------------------------------------------;
  2305. SERVICE_TABLE: ;
  2306. ;---------------------------------------------------;
  2307. ; These are the bitmaps for the 'SERVICE' arrow ;
  2308. ; that shows up next to a score. ;
  2309. ;-----------------------------------------------;
  2310. SERVICE_TABLE_START: ;
  2311. DT B'00000100' ;
  2312. DT B'00000010' ;
  2313. DT B'00000001' ;
  2314. DT B'00000010' ;
  2315. DT B'00000100' ;
  2316. DT B'00100000' ;
  2317. DT B'01000000' ;
  2318. DT B'10000000' ;
  2319. DT B'01000000' ;
  2320. DT B'00100000' ;
  2321. SERVICE_TABLE_END: ;
  2322. ;---------------------------------------------------;
  2323.  
  2324. ;---------------------------------------------------;
  2325. ; Title Title Scan Line Data ;
  2326. ;---------------------------------------------------;
  2327. TITLE_TABLE: ;
  2328. ;---------------------------------------------------;
  2329. TITLE_TABLE_START: ;
  2330. ;-----------------------------------------------;
  2331. ; The first 6x4 lines should be 0 so that the ;
  2332. ; title graphic does not merge with the scores, ;
  2333. ; and for the screen to clear the title properly;
  2334. ;-----------------------------------------------;
  2335. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2336. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2337. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2338. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2339. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2340. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2341. ;-----------------------------------------------;
  2342. ; The next 41x4 lines contain the title graphic ;
  2343. ;-----------------------------------------------;
  2344. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2345. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2346. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2347. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2348. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2349. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2350. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2351. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2352. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2353. DT B'00000111', B'10000000', B'01110000', B'00000000'
  2354. DT B'00000111', B'11000000', B'11111000', B'00000000'
  2355. DT B'00000100', B'01000000', B'10001000', B'00000000'
  2356. DT B'00000100', B'01001110', B'10001001', B'11000000'
  2357. DT B'00000111', B'11011111', B'10001011', B'11100000'
  2358. DT B'00000111', B'10010001', B'10001010', B'00100000'
  2359. DT B'00000100', B'00010001', B'10001010', B'00000000'
  2360. DT B'00000100', B'00010001', B'10001010', B'01100000'
  2361. DT B'00000100', B'00010001', B'10001010', B'01100000'
  2362. DT B'00000100', B'00010001', B'10001010', B'00100000'
  2363. DT B'00000000', B'00010001', B'00000010', B'00100000'
  2364. DT B'00000000', B'00011111', B'00000011', B'11100000'
  2365. DT B'00000000', B'00001110', B'00000001', B'11000000'
  2366. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2367. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2368. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2369. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2370. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2371. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2372. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2373. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2374. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2375. DT B'00001110', B'11101110', B'01110101', B'01110000'
  2376. DT B'00001000', B'10101010', B'00100101', B'01000000'
  2377. DT B'00001100', B'10101100', B'00100111', B'01100000'
  2378. DT B'00001000', B'10101010', B'00100101', B'01000000'
  2379. DT B'00001000', B'11101010', B'00100101', B'01110000'
  2380. DT B'00000000', B'00000000', B'00000000', B'00000000'
  2381. DT B'00000101', B'11011101', B'11101010', B'11100000'
  2382. DT B'00000100', B'01010001', B'10101010', B'10100000'
  2383. DT B'00000101', B'11011001', B'11101110', B'10100000'
  2384. DT B'00000101', B'00010001', B'10100010', B'10100000'
  2385. DT B'00000101', B'11010001', B'11100010', B'11100000'
  2386. TITLE_TABLE_END: ;
  2387. ;---------------------------------------------------;
  2388.  
  2389. ;---------------------------------------------------;
  2390. ; COPYRIGHT Scan Line Data ;
  2391. ;---------------------------------------------------;
  2392. COPYRIGHT_TABLE: ;
  2393. ;---------------------------------------------------;
  2394. ; this is the bitmap for the COPYRIGHT line ;
  2395. ; 64x8 pixels ;
  2396. ;-----------------------------------------------;
  2397. DT B'00110011', B'10111000', B'10010010', B'00111001', B'00010111', B'00000101', B'01010000', B'10001000'
  2398. DT B'00111011', B'10111001', B'00111001', B'00111011', B'10110111', B'00000101', B'01010001', B'11011100'
  2399. DT B'10101001', B'00010001', B'00101001', B'00001010', B'10010001', B'01010101', B'01010001', B'01010101'
  2400. DT B'10101001', B'00010001', B'00100001', B'00111010', B'10010111', B'01010101', B'01110001', B'01010101'
  2401. DT B'10101001', B'00010001', B'00100001', B'00111010', B'10010111', B'01010101', B'01110001', B'01010101'
  2402. DT B'10101001', B'00010001', B'00101001', B'00100010', B'10010100', B'01010101', B'00010001', B'01010101'
  2403. DT B'00111001', B'00111001', B'00111001', B'00111011', B'10010111', B'00000101', B'00010101', B'11011100'
  2404. DT B'00110001', B'00111000', B'10010010', B'00111001', B'00010111', B'00000010', B'00010100', B'10001000'
  2405. ;---------------------------------------------------;
  2406.  
  2407. ;---------------------------------------------------;
  2408. ;---------------------------------------------------;
  2409. END ;
  2410. ;---------------------------------------------------;
  2411. ;---------------------------------------------------;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement